我有一个用作桌子的课程。 这个类有一个包含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];
}
}
答案 0 :(得分:3)
这完全取决于你的课程将如何使用。如果您完全确定在任何时候只需要一个实例(每个JVM),您只想使它成为单例。
不幸的是,如果不知道你的代码在做什么的细节,就不可能给出明确的答案。
你想要两张不同的桌子吗?你说表中的数据永远不会改变,但是你会创建两个包含不同数据的表吗?如果是这样,单身就不合适了。如果您确定只需要一个实例,那么单身就可以了。
答案 1 :(得分:2)
这些行的值设置一次,永不改变。
在这种情况下,单身是个好主意,但为什么即使它是只读的同步你也会同步?
答案 2 :(得分:1)
您不必实现单例模式以在客户端之间共享对象。您可以创建一次并在构造期间传递给其他对象。
如果使用The values of these rows are set once and never change
表示表及其值在客户端使用之前完全构造,则您具有对该信息的只读访问权限。这意味着不需要同步。
答案 3 :(得分:0)
正如org.live.java所说 - 如果您在其构造函数中初始化表(非懒惰),那么没有理由同步