多次更新对象

本文关键字:对象 更新 | 更新日期: 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);

我不认为参数重用有什么问题。当然,代码的可读性是另一回事。