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;
    }

}
4

5 回答 5

6

这称为Factory模式。查看此处的描述 - 工厂设计模式

有几个优点:

  • 您可以有多个命名工厂方法来创建对象的不同风格,这可以允许使用相同的参数类型集进行重载
  • 如果合适,您可以返回一个单例,或者返回一组缓存实例中的一个
  • 如果不需要使用new
  • 使用泛型时,泛型类型由编译器推断,因此不需要使用<>运算符
  • 你可以返回一个接口而不是一个具体的类
  • 允许预构造函数初始化(例如,如果必须在调用基类构造函数之前完成初始化)

需要明确的是,上面的示例似乎只是作为“良好实践”完成的,因为没有使用上述任何功能(除了您不必使用“新”)。

于 2013-05-21T11:27:48.990 回答
3

这称为工厂方法。与构造函数相比,工厂方法有很多优点:

  • 它有一个名字(多个工厂方法可能有不同的名字)
  • 它允许返回一个缓存的实例而不是一个新的实例
  • 它允许返回一个子类实例而不是实际的类
  • 等等
于 2013-05-21T11:28:33.743 回答
0

主要优点是没有人可以创建实例,而是使用静态getInstance方法。

这样您可以确保只创建一个实例,就像Singelton 设计模式一样

于 2013-05-21T11:27:42.953 回答
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

于 2013-05-21T11:27:55.690 回答
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;
    }
于 2013-05-21T11:30:50.503 回答