全球数据,静态和新的

时间:2013-01-22 11:44:54

标签: java

从结构化到对象编程的人的基本问题...希望不要太基础。

我希望我的应用程序中的不同类共享大量数据。 这样做的最佳做法是什么? 这是对的吗?

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 个答案:

答案 0 :(得分:4)

为此使用Singleton模式。

答案 1 :(得分:1)

立即初始化数组。使用当前实现,在创建LargeData的对象之前,您将无法使用静态数组。

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

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

    private LargeData() { }
}

LargeData.myData

获取访问权限

答案 2 :(得分: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

答案 3 :(得分:0)

从实例构造函数为静态变量赋值是一个坏主意,没有空检查 - 如果你从这个类中实例化两个对象,第二个将导致你丢失存储在数组中的所有数据(你失去了对旧的引用)第二个实例化时覆盖静态引用的数组)。使用null检查它也是一个坏主意,除非你真的真的需要一个实例中的数据类型的“全局变量”方式。最好将静态引用视为全局变量,这些变量可以被所有人查看(如果它们是公共的),也可以仅从您在(私有)中定义的类或其中的某些内容中看到(受保护或包受保护的访问)。您几乎在所有情况下都希望避免使用它们,并且在类中使用Singleton模式而不是静态变量。使用Singleton模式,您可以使用实例变量和非静态getter来获取数据。

但是我没有看到你写的东西为什么你需要一个单独的模式来解决这个特定的问题 - 你只是想将数据存储在一个对象中并分享该对象,对吧?

您可以在没有静态关键字的情况下修复这样的发布代码,这样可以在应用程序中同时存在多个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中的静态变量来存储引用和静态getter,以便从任何其他Java代码访问它。如果您需要使用多个LargeData实例,则可以创建一个LargeDataRegistry类,该类封装一个Map,您可以在其中存储每个实例化的LargeData实例。

相关问题