列表中的Java元素不“自动更新”

时间:2013-05-14 18:26:04

标签: java

首先:我忘记了“自动更新”一词,但我的意思是:

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);
}

但是我想知道,对此没有更好的解决方案吗?因为它现在需要三行代码,其中两行很容易被遗忘。

4 个答案:

答案 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;

...不会将yx变量相互关联。它只是x的当前值复制到y。对x的进一步更改 not 反映在y

答案 1 :(得分:0)

在您的介绍性示例中,您将其与xy都指向同一可变对象并更改其状态的情况相混淆:

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引用一个与现在引用的对象不同的对象。但是,如果我改变那个对象本身,就像我对第一个例子所做的那样,两个变量仍然引用相同的,现在改变了,对象