Я столкнулся с проблемой, поскольку моя переменная класса автоматически обновляется последним значением. Но я хочу отдельное значение для каждого объекта.
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.state как «первый», а c1.state как «второй» с передачей одного и того же объекта как c, так и c1?
где вы вызываете execute() на своих объектах?
Подумайте, о чем вы спрашиваете: «У меня есть 3 человека. Я даю человеку C домашний адрес человека B, а человеку C1 домашний адрес человека B. Затем я говорю человеку C, чтобы он пошел по домашнему адресу, который у него есть, и окрашиваю человека, живущего там, в красный цвет. Затем я говорю человеку C1, чтобы он пошел по домашнему адресу, который у него есть, и раскрашиваю человека, живущего там, в синий цвет. После этого я проверяю, какого цвета человек B, и он всегда окрашен в синий цвет. Могу ли я как-то сделать, чтобы этот человек B был окрашен в красный цвет? человек и человек, раскрашенный в синий цвет?» Нет, нет, вы не можете.
Я согласен. Предположим, мне нужно внедрить C и C1 в список массивов. Тогда есть ли способ увидеть разницу между ассоциированным состоянием C и C1? Может быть, добавить некоторые свойства в любой из классов или переменных, которые позволят мне сохранить связанное значение состояния с C и C1?




Ваши c и c1 имеют один и тот же объект B, а именно b.
Так как state, о котором мы говорим, принадлежит b, то есть только один из них — называемый b.state.
Если вы хотите, чтобы state отличался, вы не можете использовать один и тот же объект B с обоими объектами C.
Вероятно, это сводится к непониманию семантики ссылок присваивания и передачи параметров. Ни присваивание, ни передача параметров не создают копию объекта.
But is there any way to get c.state as "first" and c1.state as "second" with passing the same object to both c and c1?
Это не могло не сработать. Предположим, что один объект B может каким-то образом иметь любое количество значений state. Всякий раз, когда вы писали b.state, как система узнает, что вы имели в виду?
Ну, это не совсем так, как я написал. Если бы конструктор C использовал свой объект B только для создания совершенно новой копии, так что он сохранил копию, а не оригинал, то вы бы достигли эффекта; в мире будет три объекта B: оригинал, копия, сделанная c, и копия, сделанная c1. Но здесь это не имеет никакого преимущества перед просто передачей в отдельных экземплярах B для начала.
Да, я понял вашу точку зрения. На самом деле я думал, будет ли хорошей идеей создать новый объект или есть другой способ справиться с этой ситуацией. Поэтому я думаю, что мне нужно создать два отдельных объекта b при создании c и c1.
«отдельный B» кажется простым подходом, если только это не просто иллюстрация какой-то реальной ситуации, которая усложнила бы ее.
На самом деле, в моем контексте я сильно ограничен в создании отдельного класса B. Можете ли вы сказать мне, есть ли другой класс A. И B расширяет A. В этом случае, как я могу решить эту проблему с помощью конструктора копирования или могу использовать любой другой подход? ?
Вы использовали один и тот же экземпляр класса B в своих двух объектах, поэтому ваша переменная состояния всегда будет обновляться последним вызванным методом, вам нужно использовать другой экземпляр B, чтобы иметь два отдельных свойства состояние.
Но, вероятно, это дубликат этого: stackoverflow.com/questions/55175471/…