0

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

int x = 5;
int y = x;
System.out.println(y); //Prints 5
x = 3;
System.out.println(y); //Now prints 3!

对于使用此作为参考的任何人的注意事项:上面的示例是错误的,如评论中所述。

但是我在列表上尝试了这种方法,但它不起作用,我的代码:

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

每当我有例如 this Account account = new Account("test", "1");,然后当我使用System.out.println(account.getData())它时 print [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

4 回答 4

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;

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

于 2013-05-14T18:29:25.213 回答
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 引用了一个与 y 现在引用的对象不同的对象。但是,如果我更改该对象本身,就像我对第一个示例所做的那样,那么两个变量仍然引用同一个,现在已更改的对象

于 2013-05-14T18:39:45.953 回答
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是原始类型还是引用类型。

于 2013-05-14T18:32:06.627 回答
0

每当我有例如这个 Account account = new Account("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;
}

这会更改“密码”成员。

然后你调用getter:

public List<Object> getData() {
    return data;
}

为什么你期望调用 setPassword 后“数据”会发生变化?

于 2013-05-14T18:33:44.643 回答