在Java中保存静态数据的最佳方法

时间:2012-09-10 16:31:06

标签: java static save

我想在许多Java类/对象中保存大量数据,我可以这样做:

public static void main(String[] args){
    System.out.println(String.valueOf(Data.Foo.bar));
    System.out.println(String.valueOf(Data.Foo.array[0].bar));
}

输出:

True
False

====包含所有数据的数据类:

public class Data {
    public class Base {
        public boolean bar = false;
        public Base[] array = {};
    }

    public class Foo extends Base {
        this.bar = true;
        this.array = {Abc};
    }
    public class Abc extends Base {}
}

NOT 想要创建这些类的实例,但我想访问类中的数据。 数据都是最终的,不会被更改,但应由另一个覆盖这些数据的对象更改。 (参见示例中的 class Foo

我需要做些什么才能使其正常工作?

修改 Data类应该可以从整个程序的每个点访问。不应该有任何Data类的实例

修改 好吧,我将举例说明这将如何以“正常”的方式运作......

public class Data {
    public Foo foo = new Foo();
    public Abc abc = new Abc();

    public class Base {
        public boolean bar = false;
        public Base[] array = {};
    }

    public class Foo extends Base {
        this.bar = true;
        this.array = {abc}; //changed to abc from Abc
    }
    public class Abc extends Base {}
}

我想参考Foo类和Abc Class WITHOUT 这两行:

    public Foo foo = new Foo();
    public Abc abc = new Abc();

2 个答案:

答案 0 :(得分:2)

通常,在类中访问数据首先是违反封装或缺少封装。如果你正在使用面向对象的编程语言,那么这两个都不是一个好主意。

假设您确实取得了一些进展,类型检查只会让事情变得更难。

看起来非常像您熟悉不同的编程语言,并询问您如何使用Java编程语言执行常见任务。答案是,你没有。

像这样重写你的查询

public static void main(String[] args) {
    System.out.println(String.valueOf(Datas.getFoo().getBar()));
    System.out.println(String.valueOf(Datas.getFoo().getArray()[0].getBar()));
}

或者请考虑修复您的逻辑,使其看起来更少关于您的工作方式以及更多关于您正在做的事情。像这样

public static void main(String[] args) {
    System.out.println(String.valueOf(Door.isOpen()));
    System.out.println(String.valueOf(Building.getDoors().atIndex(0).isOpen()));
}

最后,类只存在于概念上,当JVM运行时,每个东西都是一个类的实例。正在运行的JVM只处理实例。如果你想避免重复实例,那很好;但是,如果你想避免处理实例,那是不可能的。尝试这样做只会导致尝试使语言表现得像一种不同的语言,无论你如何看待它都会给你带来不好的结果。

答案 1 :(得分:0)

嗯,我不知道我是否理解你的问题, 但..

你不想制作实例..你想在整个程序中有1个实例吗? 你是否使用线程?

我会建议你让课程静态 .. 静态引用只是整个程序中的一个,您不需要创建任何其他实例。

没有 static 字段和类的另一种方法是通过引用调用类(引用与c / c ++中的指针“相等”)。所以你将创建for示例在main方法中只有1个实例,然后在此实例上调用一些方法或任何引用..

使用 singleton 对象的好方法。 Singleton是对象编程中的设计模式之一。在那里你有100%的保证,对象将只是整个程序中的一个..Singleton是基于静态字段。所以我不认为你不需要像单身一样“硬”的东西(但它会对你有好处)了解单身人士的事情,最好只使用静态字段和静态类