2013-05-21 6 views
0

개인 생성자를 사용하여 클래스를 건너 왔지만 개인 생성자를 호출하여 다른 public 메서드에서 개체를 반환했습니다. 우리가 생성자를 공개 할 수있을 때 그러한 구성의 장점은 무엇입니까?Private 생성자가 public 메서드로 초기화되었습니다.

public final class TokenTable { 

    static public int errorToken = 0; 
    static public int timesToken = 1; 
    static public int divToken = 2; 
    static public int plusToken = 11; 
    ...... 
    ...... 

    private final HashMap<String, Integer> keywordMap = new HashMap(); 
    private final HashMap<String, Integer> operationMap = new HashMap(); 

    private TokenTable() { 

     operationMap.put("*", timesToken); 
     operationMap.put("/", divToken); 
     operationMap.put("+", plusToken); 
     .... 



    } 


    static public TokenTable getInstance() { 

      LexTokenTabInstance = new TokenTable(); 
      return LexTokenTabInstance; 
    } 

} 
+0

, 내가 해요 약간의 실망은 여기에있는 대부분의 답변이 싱글 톤을 가져 오는 것에 실망 스럽습니다. 나는 그것이 getInstance()의 이름이라고 생각한다. (이것은 싱글 톤 게터의 가장 일반적인 이름 중 하나이다.) 여전히 그렇다. – cHao

+0

@cHao 현재 답변에 만족하지 않으면 자신의 답변을 만드시겠습니까? 제공된 것보다 더 좋은 대답이 있다고 생각한다면, 나는 그것을 읽는 것이 궁금 할 것입니다. – Supericy

+0

@ 수퍼 페리시 : 이미 두 가지 좋은 것들이 있기 때문에 이미 무엇을 말할 수 있습니다. 그것은 나를 우울하게하는 다른 것들입니다. – cHao

답변

0

주요 장점은 하나의 인스턴스를 생성 없지만 정적 getInstance 방법을 사용 할 수 있다는 것이다. 당신이 확실 단지 하나 인스턴스를 만들 수 있습니다

이 방법은 단지 Singelton design pattern 이것은 Factory 패턴이라고

5

으로 생성됩니다. 설명 here - Factory Design Pattern을 확인하십시오.

은 몇 가지 장점이 있습니다

    당신이 싱글의 경우를 반환 할 수 있습니다
  • 매개 변수 유형의 동일한 세트로 오버로드를 허용 할 수있는 객체의 다른 맛을 만들 수있는 여러라는 이름의 팩토리 메소드를 가질 수
  • 적절한 또는 제네릭을 사용하는 경우 new
  • 를 사용할 필요가없는 경우, 일반 유형이 컴파일러에 의해 유추됩니다
  • 어쩌면 인스턴스의 캐시 세트 중 하나를 반환 그래서 <>를 사용할 필요가 없습니다

위, 명확하게하기 위해 (초기화 전에 기본 클래스 생성자를 호출을 수행해야하는 경우, 예를 들어) 당신이 구체적인 클래스

  • 대신 인터페이스를 반환 할 수 있습니다
  • 운영자
  • 사전 생성자 초기화 할 수 있습니다 예를 들어 위의 기능 중 어느 것도 사용되지 않았기 때문에 ("새로운"을 사용할 필요가 없다는 것만 제외하면) "좋은 습관"으로 수행 된 것 같습니다.

    +2

    이러한 이점이 필요하지 않은 일반 대중의 공용 생성자는 약간의 정신적 짐을 운반해야합니다. 즉 : 모든 것을 공장으로 돌려 놓지 마십시오. 단지 더 번쩍 거리게 만듭니다. :) – cHao

    0

    클래스의 생성자를 숨기는 주된 이유는 해당 클래스의 객체를 만드는 방법을 제어하기 위해서입니다. 이에 대한 일반적인 예는 클래스의 한 객체 만 인스턴스화되는 Singleton 패턴에 있습니다. 다른 내용

    public class SingletonDemo { 
        private static volatile SingletonDemo instance = null; 
    
        private SingletonDemo() {  } 
    
        public static SingletonDemo getInstance() { 
          if (instance == null) { 
            synchronized (SingletonDemo.class){ 
              if (instance == null) { 
                instance = new SingletonDemo(); 
              } 
            } 
          } 
          return instance; 
        } 
    } 
    

    :이 단속하기 위해

    , 사용자는 오브젝트가 작성되어 있지 않으면 비공개 생성자를 액세스하거나, 다른 이미 생성 된 객체에 대한 참조를 반환하는 정적 메소드 액세스 예를 들어 일반적으로 공장 패턴을 살펴보십시오. http://en.wikipedia.org/wiki/Factory_method_pattern

    3

    팩토리 메소드라고합니다.

    • 그것이 이름이 (여러 팩토리 메소드는 다른 이름을 가질 수있다)
    • 가 대신
    • 가 반환 할 수있는 새로운 인스턴스의 캐시 된 인스턴스를 반환 허용 : 팩토리 메소드는 생성자에 비해 많은 장점을 가지고 당신은 클래스 외부에 여러 인스턴스의 생성을 보호하지 않으려면 서브 클래스 인스턴스 대신 실제 클래스
    0

    당신은 개인 생성자를 만들 수 있습니다.
    이것은 단일 인스턴스를 만드는 데 유용합니다. 당신이 (게으른 로딩)처럼 할 수있는,

    private static final TokenTable tokenTable = new TokenTable(); 
    
    static public TokenTable getInstance() { 
    
          return tokenTable; 
        } 
    

    을 또는 :
    당신은 (열망로드)처럼 할 수있는 내가 말을해야

    private static TokenTable tokenTable; 
    
    static public TokenTable getInstance() { 
         if(null == tokenTable){ 
         tokenTable = new TokenTable(); 
         } 
          return tokenTable; 
        } 
    
    +0

    지연로드 예제는 스레드로부터 안전하지 않습니다. : P 일반적으로 함수를 'synchronized'로 표시하거나 명시 적으로 클래스 또는 다른 클래스와 동기화합니다. – cHao

    +0

    Ok Chao,이 귀중한 정보를 보내 주셔서 감사합니다. –

    관련 문제