2013-05-21 87 views
0

我使用私有构造函数传递了一个类,但通过调用私有构造函数,该对象由另一个公共方法返回。当我们可以使构造函数公开时,这种构造的优点是什么?通过公共方法初始化的私有构造函数

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()'的名字(这是单体getter的最常见名称之一)......但仍然如此。 – cHao

+0

@cHao如果您对目前的答案不满意,为什么不创建自己的答案?如果你觉得有比所提供的更好的答案,我会好奇的阅读它。 – Supericy

+0

@Supericy:因为这里有两个很好的,已经说了很多我会。这是其他人压抑我。 – cHao

回答

5

这就是所谓的Factory模式。检查描述here - Factory Design Pattern

有几个优点:

  • 你可以有多个命名的工厂方法来创建对象的不同口味,可以允许与同一组参数类型
  • 你可以返回一个单身,如果超载适当也许返回缓存实例集合的一个
  • 如果使用泛型时不需要使用new
  • ,泛型类型由编译器推断所以不需要使用<>运营商
  • 你可以返回一个接口,而不是具体的类
  • 的允许构造预初始化

需要明确的是,上面的(例如,如果初始化必须在调用基类构造函数之前完成)例如,它似乎只是作为一种“良好做法”,因为没有使用上述功能(除了不必使用“新”)。

+2

应该注意的是,如果你不需要任何这些优点,普通的公共构造函数就会带来一点点的精神包袱。即:不要把所有东西都变成一个工厂,只是因为它变得很炫。 :) – cHao

0

隐藏类的构造函数的主要原因是控制如何创建该类的对象。一个常见的例子是单例模式,其中只有一个类的一个对象被实例化。

为了监管此事,用户访问,将访问私有的构造函数,如果不创建对象,否则返回参照已创建对象的静态方法:

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

好的超,感谢这个有价值的信息。 –

相关问题