【问题标题】:Java insists on changing both variablesJava 坚持改变这两个变量
【发布时间】:2017-12-05 18:09:24
【问题描述】:

在运行我的 MVC 模型应用程序时,会创建一个 ApplicationModel 的 Singleton 实例。

在我的控制器类中运行 main 方法时,使用 setShops()List<Shop> 分配给 shops。如果shopsDefault = nullsetShops() 也将继续将相同的List<Shop> 分配给shopsDefault

到目前为止,一切都很好。

但是,当我调用 sortShopsByName() - 正如您在下面看到的那样使用 setShops() - shopsshopsDefault 都已排序!为什么它不按预期对shops 进行排序?

我的ApplicationModel 班级...

import java.util.*;

public class ApplicationModel {

    //static variables
    private static ApplicationModel instance = null;

    //instance variables
    private List<Shop> shops;
    private List<Shop> shopsDefault;

    //constructors
    private ApplicationModel() {}

    //getInstance method
    public static ApplicationModel getInstance() {
        if (instance == null) {
            instance = new ApplicationModel();
        }

        return instance;
    }

    //getters and setters
    public List<Shop> getShops() {
        return shops;
    }

    public void setShops(List<Shop> shops) {
        this.shops = shops;
        if (this.shopsDefault == null) {
            this.shopsDefault = shops;
        }
    }

    public List<Shop> getShopsDefault() {
        return this.shopsDefault;
    }


    //Shop methods
    public void sortShopsByName() {
        List<Shop> shops = this.getShops();
        Collections.sort(shops);
        this.setShops(shops);
    }

    public void returnShopsToDefaultOrder() {

        List<Shop> shopsDefault = this.getShopsDefault();
        setShops(shopsDefault);
    }
}

【问题讨论】:

  • 您似乎只将两个变量都设置为List&lt;Shop&gt; 的单个实例。当该实例被排序时,它被排序。任何指向它的引用都会反映这一点。
  • "如果shopsDefault = nullsetShops() 也将继续将相同的List&lt;Shop&gt;分配给shopsDefault。" 相同的列表。

标签: java setter accessor


【解决方案1】:

shops 分配给shposDefault 后,它们都会引用同一个实例。因此,通过任一实例对实例所做的更改将通过两个引用可见。

如果这不是预期的行为,您可以在设置null 时复制shops 列表。例如:

public void setShops(List<Shop> shops) {
    this.shops = shops;
    if (this.shopsDefault == null) {
        this.shopsDefault = new ArrayList<>(shops);
    }
}

【讨论】:

  • 对自己没有发现这一点感到恼火!感谢所有回答的人!
【解决方案2】:

因为它是同一个列表。如果您想要不同的列表,请在将其分配给 storesDefault 时制作一份副本(即 new ArrayList&lt;Shop&gt;(shops))。

【讨论】:

    【解决方案3】:

    在此代码中,您将两个成员设置为相同的列表引用:

    this.shops = shops;
    if (this.shopsDefault == null) {
       this.shopsDefault = shops;
    }
    

    如果您想将它们分开,请使用以下命令:

    this.shops = shops;
    if (this.shopsDefault == null) {
       this.shopsDefault = new ArrayList<Shop>(shops);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多