我遇到了私有构造函数的类,但是通过调用私有构造函数,该对象由另一个公共方法返回。当我们可以将构造函数公开时,这样的构造可能有什么优势?
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 :(得分:5)
这称为Factory
模式。查看说明here - Factory Design Pattern。
有几个优点:
new
<>
运算符要清楚,上面的例子看起来它只是作为一种“良好实践”而完成,因为没有使用上述功能(除了你不必使用“新”)。
答案 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;
}