有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在对象上共享数据的最佳设计是什么?

我想在对象之间共享数据。 实际上,例如,有一个由水和个人组成的世界。 我希望每个人都能接触到水。 我考虑过在收藏中改造单独的桌子,或者把水变成一个单独的桌子,但实际上,最好的设计是什么? (我们可能在单个对象上有多线程进程……所以我们可能需要一个线程安全的实现。) (此外,我想知道如何通过争论或实例化每个人的水,但它似乎不是最有效的实现(处理实例化)?…)

一组简单的对象,用于固定想法(这组对象根本不共享水,个体在此处显示“空”):

package myworld.testing;

public class World {

    static Water evolution;
    static Individual [] tribe;

    public World(){
        evolution=new Water();
    }
    public static Water getWater(){
        return evolution;
    }

    public static void main(String[] args) {
        evolution=new Water();
        System.out.println("info "+evolution.get());
        tribe = new Individual[10];
        for(Individual individual : tribe){
            System.out.println("trace "+individual);
        }

        evolution=new Water("sprakly");
        System.out.println("info "+evolution.get());
        for(Individual individual : tribe){
            System.out.println("trace "+individual);
        }

        evolution.set("salty");
        System.out.println("info "+evolution.get());
        for(Individual individual : tribe){
            System.out.println("trace "+individual);
        }
    }

}

package myworld.testing;

public class Individual {
    int data;
    public Individual(){
        data=0;
    }
    public Individual(int i){
        data=i;
    }
    public void set(int i){
        data=i;
    }
    public int get(){
        return data;
    }
    public String toString(){
        return World.getWater().get()+" "+data;
    }
}

package myworld.testing;

public class Water {
    private static Water instance = null;
    String type;
    public static Water getInstance(){
        if(instance == null) {
             instance = new Water();
          }
          return instance;
    }
    public Water(){
        type="1";
    }
    public Water(String str){
        type=str;
    }
    public void set(String str){
        type=str;
    }
    public String get(){
        return type;
    }
}

非常感谢您的帮助和建议。 请随意分享您的想法:)


共 (1) 个答案

  1. # 1 楼答案

    在迭代Individual数组时获取null值的原因是,对于每个数组元素,您尚未创建引用将占用它的实例。实例化数组只会创建null指针的顺序内存块。正确的解决方案是:

    tribe = new Individual[10];
    for(int i = 0; i < tribe.length; i++) {
        tribe[i] = new Individual();
    }
    

    关于“访问水的个人”的问题,必须使用public可见性修饰符在World中声明Water的封装实例,以授予对包含World的包之外的所有类的访问权

    考虑到IndividualWorld位于同一个包中,不需要使用public修饰符