首先:我忘记了“自动更新”一词,但我的意思是:
int x = 5;
int y = x;
System.out.println(y); //Prints 5
x = 3;
System.out.println(y); //Now prints 3!
(请注意,任何人使用此作为参考:以上示例错误,如评论中所述。)
但是我在List上尝试了这种方法,它不起作用,我的代码:
Account.java的相关部分:
public class Account extends Entity<String, Account> {
private String username;
private String password;
public Account(final String username, final String password) {
this.username = username;
this.password = password;
key = username;
data.add(password);
}
public String getUsername() {
return username;
}
public void setUsername(final String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(final String password) {
this.password = password;
}
}
Entity.java的相关部分:
abstract public class Entity<K, D> {
protected K key;
protected List<Object> data;
public Entity() {
data = new ArrayList<>();
}
public K getKey() {
return key;
}
public List<Object> getData() {
return data;
}
protected List<Object> createData(final DataAction dataAction) {
List<Object> list = new ArrayList<>();
if (dataAction == DataAction.INSERT) {
list.add(key);
}
list.addAll(data);
if (dataAction == DataAction.UPDATE) {
list.add(key);
}
return list;
}
}
每当我有这个Account account = new Account("test", "1");
时,然后当我使用System.out.println(account.getData())
它打印[1]
时,这仍然是正确的。但是当我执行account.setPassword("11");
然后再System.out.println(account.getData())
时,它仍会打印[1]
而不是预期的[11]
。
我希望data
会自动更新,就像x = y
指向相同的内存位置一样。
猜猜发生了什么事?实施错误?还是功能?我怎样才能有效地解决这个问题?
问候。
编辑:将setPassword()
更改为以下代码,现在应该可以使用:
public void setPassword(final String password) {
int index = data.indexOf(this.password);
this.password = password;
data.set(index, password);
}
但是我想知道,对此没有更好的解决方案吗?因为它现在需要三行代码,其中两行很容易被遗忘。
答案 0 :(得分:7)
我觉得你很困惑。这段代码:
int x = 5;
int y = x;
System.out.println(y); //Prints 5
x = 3;
System.out.println(y); //Now prints 3!
...将不打印3.此作业:
int y = x;
...不会将y
和x
变量相互关联。它只是将x
的当前值复制到y
。对x
的进一步更改 not 反映在y
。
答案 1 :(得分:0)
在您的介绍性示例中,您将其与x
和y
都指向同一可变对象并更改其状态的情况相混淆:
List<String> x = new ArrayList<>();
x.add("a");
y = x;
y.add("b");
System.out.println(y); // prints [a, b]
在Account
构造函数中,您同时拥有
this.password = password;
和
data.add(password);
但在setPassword
中你只有
this.password = password;
当然,当您调用setPassword
时,data
列表的内容不受其影响,无论password
是基元类型还是引用类型,都是如此。
答案 2 :(得分:0)
每当我有这个帐户帐户=新帐户(“test”,“1”);然后当我使用System.out.println(account.getData())时,它打印[1],仍然是正确的。但是当我执行account.setPassword(“11”);然后继续System.out.println(account.getData())它仍然打印[1]而不是预期的[11]。
你正在打电话给这个二传手:
public void setPassword(final String password) {
this.password = password;
}
更改“密码”成员。
然后你打电话给吸气者:
public List<Object> getData() {
return data;
}
为什么在调用setPassword后,您希望“数据”发生变化?
答案 3 :(得分:0)
某些类型是“可变的”,因此您可以更改单个对象的值。数组就是一个例子:
int[] x = new int[]{5};
int[] y = x;
System.out.println(y[0]); //Prints 5
x[0] = 3;
System.out.println(y[0]); //Now prints 3!
与:比较:
int[] x = new int[]{5};
int[] y = x;
System.out.println(y[0]); //Prints 5
x = new int[]{3};
System.out.println(y[0]); //Still prints 5!
y = x
使y引用,而不是x,而是x引用的相同值。当我为x分配一个新值时,正如我在第二个例子中所做的那样,我正在使x引用一个与现在引用的对象不同的对象。但是,如果我改变那个对象本身,就像我对第一个例子所做的那样,两个变量仍然引用相同的,现在改变了,对象