私有构造函数由公共方法初始化

时间:2013-05-21 11:25:00

标签: java constructor public-method

我遇到了私有构造函数的类,但是通过调用私有构造函数,该对象由另一个公共方法返回。当我们可以将构造函数公开时,这样的构造可能有什么优势?

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

}

5 个答案:

答案 0 :(得分:5)

这称为Factory模式。查看说明here - Factory Design Pattern

有几个优点:

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

要清楚,上面的例子看起来它只是作为一种“良好实践”而完成,因为没有使用上述功能(除了你不必使用“新”)。

答案 1 :(得分:3)

这称为工厂方法。工厂方法比构造函数有许多优点:

  • 它有一个名称(多个工厂方法可能有不同的名称)
  • 它允许返回缓存的实例而不是新实例
  • 它允许返回子类实例而不是实际的类

答案 2 :(得分:0)

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

这样您就可以确保只创建一个实例,就像Singelton design pattern

一样

答案 3 :(得分: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

答案 4 :(得分: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;
    }