Переменная остановки Java от получения обновленного класса - PullRequest
0 голосов
/ 26 марта 2019

Я столкнулся с проблемой, так как моя переменная класса автоматически обновляется с последним значением.Но я хочу отдельную ценность для каждого объекта.

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, оба состояния равны «second».Я знаю, если я создам два отдельных объекта B, т.е. b1 и b2, и передам их в c и c1 при инициализации, это даст мне другой результат, как я и ожидал.Но есть ли способ получить c.state как «first» и c1.state как «second» с передачей одного и того же объекта в c и c1?

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Вы использовали один и тот же экземпляр класса B в своих 2 объектах, поэтому ваша переменная состояния всегда будет обновляться последним вызванным методом, вам нужно использовать другой экземпляр B, чтобы иметь два отдельных свойства state .

0 голосов
/ 26 марта 2019

Ваши c и c1 совместно используют один и тот же B объект, а именно b.

Поскольку обсуждаемый нами state относится к b, есть только один из них - b.state.

Если вы хотите, чтобы state отличался, вы не можете использовать один и тот же объект B с обоими C объектами.

Вероятно, это сводится к неправильному пониманию эталонной семантики присваивания и передачи параметров. Ни присваивание, ни передача параметров не делают копию объекта.

Но есть ли способ получить c.state как "first" и c1.state как «второй» с передачей одного и того же объекта в c и c1?

Это не могло сработать. Предположим, что один объект B может каким-либо образом иметь любое количество значений state. Всякий раз, когда вы пишете b.state, как система узнает, какую именно вы имели в виду?

Ну, это не совсем так, как я написал. Если бы конструктор C использовал только свой объект B для создания полностью новой копии, так что он сохранил копию, а не оригинал, то вы бы достигли эффекта; в мире будет три B объекта, оригинал, копия, сделанная c, и копия, сделанная c1. Но это не имеет здесь никакого преимущества по сравнению с передачей отдельных B экземпляров для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...