0

来自结构化对象编程的人提出的基本问题......希望不要太基本。

我希望在我的应用程序中拥有大量由不同类共享的数据。这样做的最佳做法是什么?它是否正确?

public class LargeData {
    private static long[] myData;
    private static final int MAX = 100000;

    public LargeData() {
        myData = new long[MAX];
        // ... initialize
    }

    public long getData(int x) {
    // ... do whatever and return a long
    }
}

如果这是正确的,那么从我的任何课程中访问这些数据的正确方法是什么?我应该做一个

LargeData ld = new LargeData();

在每个想要访问 myData 的类中?

谢谢你,很抱歉太容易了...... :)

4

4 回答 4

4

为此使用单例模式。

于 2013-01-22T11:47:35.200 回答
1

立即初始化数组。使用当前实现,您将无法使用静态数组,直到创建LargeData.

final此外,如果仅用于保存数组的类通过将其和构造函数设置为来防止其实例化和扩展private

public final class LargeData {
    public static long[] myData = new long[100000];

    private LargeData() { }
}

并获得访问权限LargeData.myData

于 2013-01-22T11:51:52.443 回答
1

每次打电话

LargeData ld = new LargeData();

在您的代码中,您将有效地调用

myData = new long[MAX];

这是错误的。

你可以做的是:

public class LargeData {

    private static final int MAX = 100000;
    public static long[] myData = new long[MAX];
}

LargeData.myData从任何地方访问它。

于 2013-01-22T11:52:19.137 回答
0

如果没有空检查,从实例构造函数为静态变量赋值是一个坏主意 - 如果您曾经从此类实例化两个对象,第二个对象将导致您丢失存储在数组中的所有数据(当您丢失对旧数组的引用时)第二个实例化覆盖静态引用)。但是,使用空值检查也是一个坏主意,除非您真的真的真的需要以一种“全局变量”方式的实例中的数据。最好将静态引用视为全局变量,这些变量可以对所有人可见(如果它们是公共的),或者只能从您定义它的类(私有)或介于两者之间(受保护或包保护访问)的类中可见。尽管在几乎所有情况下,您都非常希望避免使用它们,并使用单例模式而不是类中的静态变量。

但是,鉴于您所写的内容,我看不出为什么您需要一个单例模式来解决这个特定问题——您只想将数据存储在一个对象中并共享该对象,对吗?

您可以像这样在没有静态关键字的情况下修复发布的代码,这允许多个 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 实例。

于 2013-01-22T12:59:00.997 回答