【问题标题】:Java stop variable from getting updated of a classJava 停止变量获取类的更新
【发布时间】:2019-03-25 21:26:00
【问题描述】:

我遇到了一个问题,因为我的类变量会自动更新为最新值。但我想要每个对象的单独值。

public class B {

    public String state; 

    public B(){    
        this.state = "new";
    }

    public void firstMethod(){

        this.state = "first";          

    }

    public void secondMethod(){        

        this.state = "second";
    }

}


public abstract class C {

    public B b;    

    public C(B service){       
        this.b = service;
    }

    public abstract void execute();
}


public static void main(String[] args) {
            B b = new B();
        C c = new C(b) {
            @Override
            public void execute() {               
                b.firstMethod();

            }
        };  

        C c1 = new C(b) {
            @Override
            public void execute() {               
                b.secondMethod();

            }
        }; 

    c.execute();
    c1.execute();
    System.out.println(c.b.state);

    System.out.println(c1.b.state);
}

我得到 c 和 c1 两个状态都等于“秒”。我知道如果我创建两个单独的 B 对象,即 b1 和 b2 并在初始化时将它们传递给 c 和 c1,那么它会给我带来不同的结果,正如我所期望的那样。但是有没有办法通过将相同的对象传递给 c 和 c1 来获得 c.state 作为“第一”和 c1.state 作为“第二”?

【问题讨论】:

  • 你在哪里调用 execute() 来处理你的对象?
  • 想想你在问什么:"我有 3 个人。我给 C 人 B 的家庭住址,我给 C1 人 B 的家庭住址。然后我告诉人C去他们的家庭住址,把住在那里的人涂成红色。然后我告诉C1去他们有的家庭住址,把住在那里的人涂成蓝色。然后我检查人B是什么颜色,他们总是被涂成蓝色。我能不能让那个人 B 既是红色的人又是蓝色的人?” 不,不,你不能。
  • 我同意。假设我需要将 C 和 C1 注入到数组列表中。那么,有什么办法可以看出C和C1的关联状态有什么区别呢?可能会在任何一个类或变量中添加一些属性,以允许我将关联的状态值与 C 和 C1 一起存储?

标签: java class oop


【解决方案1】:

您的cc1 共享完全相同的B 对象,即b

由于我们正在讨论的state属于b,所以只有其中之一——称为b.state

如果您希望 state 不同,则不能将相同的 B 对象与两个 C 对象一起使用。

这可能归结为对赋值和参数传递的引用语义的误解。赋值和参数传递都不会复制对象。

但是有没有办法让 c.state 作为“第一”而 c1.state 作为 “第二个”将同一个对象传递给 c 和 c1?

这不可能。假设单个B 对象可以以某种方式具有任意数量的state 值。每次你写b.state,系统怎么知道你指的是哪一个?

嗯,我写的并不完全正确。如果C的构造函数只使用它的B对象来做一个全新的副本,这样它就保留了副本而不是原来的,那么你就达到了效果;世界上有三个B 对象,原始对象、c 制作的副本和c1 制作的副本。但这与只传入单独的 B 实例相比没有任何优势。

【讨论】:

  • 是的,我明白你的意思。实际上,我在考虑创建一个新对象是否是个好主意,或者有另一种处理这种情况的方法。所以我想我需要在创建 c 和 c1 时创建两个单独的 b 对象。
  • "separate B" 似乎是一种简单的方法,除非这只是为了说明某些实际情况而使其变得更加复杂。
  • 实际上,在我的上下文中,我严格限制创建一个单独的 B。你能告诉我是否还有另一个类 A。B 扩展了 A。在这种情况下,我将如何解决这个问题复制构造器还是可以采用任何其他方法?
【解决方案2】:

您在 2 个对象中使用了 B 类的相同实例,因此您的状态变量将始终由最后调用的方法更新,您需要使用 B 的另一个实例来拥有两个分开的 state属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2018-07-30
    • 2022-01-06
    • 2022-01-26
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多