如果没有空检查,从实例构造函数为静态变量赋值是一个坏主意 - 如果您曾经从此类实例化两个对象,第二个对象将导致您丢失存储在数组中的所有数据(当您丢失对旧数组的引用时)第二个实例化覆盖静态引用)。但是,使用空值检查也是一个坏主意,除非您真的真的真的需要以一种“全局变量”方式的实例中的数据。最好将静态引用视为全局变量,这些变量可以对所有人可见(如果它们是公共的),或者只能从您定义它的类(私有)或介于两者之间(受保护或包保护访问)的类中可见。尽管在几乎所有情况下,您都非常希望避免使用它们,并使用单例模式而不是类中的静态变量。
但是,鉴于您所写的内容,我看不出为什么您需要一个单例模式来解决这个特定问题——您只想将数据存储在一个对象中并共享该对象,对吗?
您可以像这样在没有静态关键字的情况下修复发布的代码,这允许多个 LargeData 实例在您的应用程序中一次处于活动状态:
public class LargeData {
private long[] myData; // instance variable to store the data
private static final int MAX = 100000; // max length
public LargeData() {
myData = new long[MAX];
}
public long[] getData() {
return myData;
}
}
然后您可以将数据用作:
LargeData ld = new LargeData();
long[] = ld.getData();
你可以使用任何你喜欢的方式存储在 ld 中的引用,你可以将它传递给你的其他类,等等。
一个更好的主意是不公开数组,而是创建一个 API,您可以通过它使用存储的数据。例如:
public long getLong(int n) { return myData[n]; }
public void setLong(int n, long value) { myData[n] = value; }
现在,如果您不想传递对存储在 ld 中的 LargeData 实例的引用,您可以使用 LargeData 中的静态变量来存储引用和允许您从任何其他 java 代码访问它的静态 getter。如果您需要使用多个 LargeData 实例,您可以创建一个封装了 Map 的 LargeDataRegistry 类,您将在其中存储每个实例化的 LargeData 实例。