简而言之,我正在尝试构建一个抽象类的子类,所有这些都是单例。我想把单身“逻辑”放在超类中。这在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
}
答案 0 :(得分:1)
只有Table
类的一个副本(保留多个类加载器等等!),因此只有一个值m_Instance
。
这意味着您不能拥有每个子类的单个部分 - 只有 子类的任何一个
的单个部分。可以处理多个子类,例如通过将它们存储在超类中的Map
中并按类查找它们,但复杂性可能不值得。
在任何一种情况下,getInstance
方法都会返回Table
,因此您会失去类型安全性 - 您可能需要继续从Table
转换为CallTable
,例如。 Java的类型系统不支持这种情况。
另请注意,单身模式至少可以说是有争议的,很多人试图避免它。
答案 1 :(得分:1)
我想把单身“逻辑”放在超类中。
什么逻辑?只需关注the established idiom,然后使用enum
定义您的单身人士。它只是有效。无需将Singleton逻辑放在抽象基类中。 enum
已为您完成所有工作。