从抽象类构建单身人士

时间:2014-06-08 08:20:06

标签: java inheritance reflection 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
}

2 个答案:

答案 0 :(得分:1)

只有Table类的一个副本(保留多个类加载器等等!),因此只有一个值m_Instance

这意味着您不能拥有每个子类的单个部分 - 只有 子类的任何一个

的单个部分。

可以处理多个子类,例如通过将它们存储在超类中的Map中并按类查找它们,但复杂性可能不值得。

在任何一种情况下,getInstance方法都会返回Table,因此您会失去类型安全性 - 您可能需要继续从Table转换为CallTable,例如。 Java的类型系统不支持这种情况。

另请注意,单身模式至少可以说是有争议的,很多人试图避免它。

答案 1 :(得分:1)

  

我想把单身“逻辑”放在超类中。

什么逻辑?只需关注the established idiom,然后使用enum定义您的单身人士。它只是有效。无需将Singleton逻辑放在抽象基类中。 enum已为您完成所有工作。