2012-06-20 5 views
4

나는 다음과 같은 예에서 _internal에 대한 참조를보고 계속 : 나는 개인적으로 접근 생성자의 코드에서 수집 한_internal의 의미는 무엇입니까?

class Symbol { 
    final String name; 
    static Map<String, Symbol> _cache; 

    factory Symbol(String name) { 
     if (_cache == null) { 
     _cache = {}; 
    } 

    if (_cache.containsKey(name)) { 
     return _cache[name]; 
    } else { 
     final symbol = new Symbol._internal(name); 
     _cache[name] = symbol; 
     return symbol; 
     } 
    } 

    Symbol._internal(this.name); 
} 

. 마지막 줄인 Symbol._internal(this.name);은 메서드 본문이 아닌 클래스 본문 내에서 문이 나타나고 메서드 본문이없는 내부 생성자 정의라고 생각하기 때문에 약간 혼란스러워 보입니다.

내 가정이 맞습니까?

답변

12

_internal 건설은 단지 이름이 종종 클래스에 privat의있는 생성자에게 주어집니다 (이름은 당신이 어떤 Class._someName 구조를 사용하여 개인 생성자를 만들 수 있습니다 ._internal 할 필요 없음) . 클래스 또는 중 하나에 비공개로 어떤 _construction 일반 다트 자국에서

class Person { 
    factory Person(String name) { 
    if(_cache === null) { 
     _cache = new Map<String,Person>(); 
    } 
    if(_cache[name] === null]) { 
     _cache[name] = new Person._internal(name); 
    } 
    return cache[name]; 
    } 

    Person._internal(this.name); 

    final String name; 
    static Map<String,Person> _cache; 
} 

:

예를 들어 다음 코드는 사용자가 캐싱 생성자를 사용하여 클래스 외부에서 새로운 사람을 만들 수 있습니다 그것을 포함하는 라이브러리. 예를 들어이 같은 전역 함수로 정의 할 수 있습니다를 정의하는 라이브러리에서 공급되는 모든 파일에서 호출 할 수 있습니다

_globalToThisLibaryOnly() { 
    print("can only be called globally within this #library"); 
} 

.

+1

감사합니다. Lars. 이것은 많은 도움이됩니다. 아직 완전히 이해하지 못하는 것들이 있습니다. 생성자는 선택적으로 메서드 본문을 가질 수 있습니까? final로 정의 된 클래스 멤버는 생성자의 매개 변수 목록에서만 설정할 수 있지만 생성자 본문에서는 설정할 수 없습니다. 이것들은 아직도 나를 혼란스럽게 만드는 것들입니다. –