多次更新对象
本文关键字:对象 更新 | 更新日期: 2023-09-27 18:15:28
我们可以用一个名字创建两个对象,就像这样:
(我的问题是关于参数对象)
List<ParameterClass> parameters = new ArrayList<ParameterClass>();
ParameterClass param = new ParameterClass();
param.setName("name1");
parameters.add(param);
param = new ParameterClass();
param.setName("name2");
parameters.add(param);
如您所见,这段代码可以很好地编译和工作。但我的问题是你是否推荐这种编码方式?为不同的目标使用一个变量是可以接受的吗?我们为什么不应该这么做呢?谢谢
重用变量是可以接受的,但它确实会妨碍代码的可读性,还可能导致难以定位bug。
我会这样做:
List<ParameterClass> parameters = new ArrayList<ParameterClass>();
parameters.add(new ParameterClass("name1"));
parameters.add(new ParameterClass("name2"));
这将删除您的参数变量,并解决您的问题。
你当然需要有一个以name作为参数的构造函数,但我认为这是一个公平的游戏
是的,如果你的所有代码都使用了这个变量
当你声明并初始化第一个变量时,编译器编写代码为param变量所指向的实例保留一块内存区域,你使用该变量来设置属性,
ParameterClass param = new ParameterClass();
param.setName("name1");
parameters.add(param);
则声明并初始化另一个内存区域,并使用相同的变量指向该区域,但这是一个完全不同的区域,并且无法将两个
混合使用。param = new ParameterClass();
param.setName("name2");
parameters.add(param);
当然,您需要将对这些区域的引用传递给某个容器对象,以便稍后能够检索它们
在此代码中
ParameterClass param = new ParameterClass();
param只是对new()创建的对象的引用。当您再次调用new()时,引用将指向新创建的对象。所以你可以说这里的reference是假的因为你的目的是填充ArrayList
在某种意义上,这实际上是正确的方法。当您说parameters.add(param);
时,实际发生的是创建另一个引用并指向您的旧对象。现在您可以自由地将旧引用指向您创建的任何新对象。要么按照明宇描述的方式(=根本不使用名称),另一种可能是缩小名称的范围:
List<ParameterClass> parameters = new ArrayList<ParameterClass>();
{
ParameterClass param = new ParameterClass();
param.setName("name1");
parameters.add(param);
}
{
ParameterClass param = new ParameterClass();
param.setName("name2");
parameters.add(param);
}
这样你就可以"重用"这个名字,并确保param不会以错误的方式被使用。
这也是"copy &"粘贴安全",因为这样的错误很难发现:
ParameterClass param = new ParameterClass();
List<ParameterClass> parameters = new ArrayList<ParameterClass>();
param.setName("name1");
parameters.add(param);
param.setName("name2");
parameters.add(param);
我不认为参数重用有什么问题。当然,代码的可读性是另一回事。