将表类创建为单例

时间:2010-12-31 15:04:09

标签: java multithreading concurrency singleton

我有一个用作桌子的课程。 这个类有一个包含16个行类的数组。 这些行类都有6个双变量。 这些行的值设置一次,永远不会改变。

将这张桌子变成单身人士会是一个好习惯吗?优点是它的内存成本更低,但是表将从多个线程调用,因此我必须同步我的代码,这会导致应用程序运行速度变慢。但是,此表中的查找可能只是执行的总代码的一小部分。

编辑:这是我的代码,有更好的方法可以做到这一点,还是这是一个好习惯?根据此问题中的建议删除了synchronized关键字。

final class HalfTimeTable {
    private HalfTimeRow[] table = new HalfTimeRow[16];
    private static final HalfTimeTable instance = new HalfTimeTable();

    private HalfTimeTable() {
        if (instance != null) {
            throw new IllegalStateException("Already instantiated");
        }
        table[0] = new HalfTimeRow(4.0, 1.2599, 0.5050, 1.5, 1.7435, 0.1911);
        table[1] = new HalfTimeRow(8.0, 1.0000, 0.6514, 3.0, 1.3838, 0.4295);
        //etc
    }

    @Override
    @Deprecated
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException(); 
    }

    public static HalfTimeTable getInstance() {
        return instance;
    }

    public HalfTimeRow getRow(int rownumber) {
        return table[rownumber];
    }
}

4 个答案:

答案 0 :(得分:3)

这完全取决于你的课程将如何使用。如果您完全确定在任何时候只需要一个实例(每个JVM),您只想使它成为单例。

不幸的是,如果不知道你的代码在做什么的细节,就不可能给出明确的答案。

你想要两张不同的桌子吗?你说表中的数据永远不会改变,但是你会创建两个包含不同数据的表吗?如果是这样,单身就不合适了。如果您确定只需要一个实例,那么单身就可以了。

答案 1 :(得分:2)

  

这些行的值设置一次,永不改变。

在这种情况下,单身是个好主意,但为什么即使它是只读的同步你也会同步?

答案 2 :(得分:1)

您不必实现单例模式以在客户端之间共享对象。您可以创建一次并在构造期间传递给其他对象。

如果使用The values of these rows are set once and never change表示表及其值在客户端使用之前完全构造,则您具有对该信息的只读访问权限。这意味着不需要同步。

答案 3 :(得分:0)

正如org.live.java所说 - 如果您在其构造函数中初始化表(非懒惰),那么没有理由同步