简而言之,我正在尝试构建抽象类的子类,所有这些子类都将是singleton。我只想把单例"逻辑"放在超级类中。这在Java中可能吗?这是代码:
public abstract class Table {
//the static singleton instance. this will be inherited by subclasses of this class.
protected static Table m_Instance;
/**
* @param tableName the database table name.
*/
protected Table(String tableName, List<Column> columns) {
TABLE_NAME = tableName;
if(columns != null) {
if(!m_Columns.isEmpty())
m_Columns.clear();
m_Columns.addAll(columns);
} else {
throw new IllegalStateException("the columns list was null. this is a developer error. please report to support.");
}
}
protected static Table getInstance() {
if(m_Instance == null)
m_Instance = <? extends Table>;
}
}
这里只是一个说明实现的简介:
public class CallTable extends Table {
//this class would inherit 'getInstance()' and the method would return a 'CallTable' object
}
只有一个Table
类的副本(留出多个类加载器等!(,因此只有一个值m_Instance
。
这意味着你不能在每个子类中都有一个的单例-只有任何一个子类的单例。
可以处理多个子类,例如将它们存储在超类的Map
中,并按类查找,但其复杂性可能不值得
在任何一种情况下,getInstance
方法都将返回Table
,因此您将失去类型安全性——例如,您可能需要继续从Table
强制转换为CallTable
。Java的类型系统不支持这种情况。
还需要注意的是,至少可以说,singleton模式是有争议的,许多人都试图避免它
我只想把单例"逻辑"放在超级类中。
什么逻辑?只需遵循既定的习惯用法,用enum
s定义你的单身汉。它很管用。不需要将Singleton逻辑放在抽象基类中。enum
已经为你做了所有的工作。