使用单例访问"constant global array"是否合适?



我有一个不需要修改的 int 数组。在代码运行之前,数组不可用,因为它使用文件中的一些数据,然后修改这些数据以生成数组值。

需要从许多类访问此数组。据我所知,一个糟糕的方法是不断将数组传递给函数,另一种更糟糕的方法是声明为全局变量。

我的直觉是,也许我应该使用单例,它只会保存一个 int 数组,并在调用时返回该数组的实例。假设这是正确的,那么首先将该数组传递给单例一次并对其进行设置的正确方法是什么。那么调用单例并返回数组实例的正确方法是什么?

谢谢

您在此处的问题与数组是否为全局无关。你几乎在用单例做同样的事情。全局变量的问题与共享状态有关,因为任何人都可以访问它们并弄乱它们。因此,很难推断这种变量的状态或其生命周期。

我建议将数组包装在它自己的类中。这实际上是您的单例。数组将是静态成员。此外,与其返回对数组本身的引用,不如返回数组的副本。这样,没有人可以直接修改数组。

您的类可能如下所示:

//pick a better name; this is just for demo purposes
public class Singleton {
    private static int[] array = {};
    private static boolean initialized = false;
    public static void initialize(int[] arr) {
        if(!initialized) {
            array = new int[arr.length];
            System.arraycopy(arr, 0, array, 0, arr.length);
            initialized = true;
        } else {
            throw new IllegalStateException("Array has already been initialized");
        }
    }
    public static int[] getArray() {
        return Arrays.copyOf(array, array.length);  
    }
}

老实说,这对我来说确实有点不优雅和笨重。相反,也许您可以尝试使用不可修改的列表(Collections.unmodifiableList(List<? extends T> list))。您提到这是一个 2D 数组,但您仍然可以使用不可修改的列表执行此操作;你最终会得到List<List<Integer>>.首先构建内部列表(行的值),然后将它们作为不可修改的列表插入到外部列表中。然后将外部列表本身设置为不可修改的列表。您可以将此列表包装在其自己的类型对象中,该对象将是单例(有点像上面的数组示例)。然后,提供从列表中检索元素的get(row, column)方法,而不是提供对 2D 数组或列表本身的访问权限。但是,如果您正在这样做,那么您可能可以将列表保留为常规列表,因为一旦初始化,任何人都无法修改它。

最新更新