1

我们可以像这样只用一个名称创建两个对象:(
我的问题是关于param对象)

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

如您所见,此代码可以编译并且运行良好。但我的问题是你是否推荐这种编码?为不同的目标使用一个变量是否可以接受?为什么我们不应该这样做?

谢谢

4

6 回答 6

2

重用变量是可以接受的,但它确实会妨碍代码的可读性,并且还可能导致难以定位错误。你需要相应地称重。

于 2013-05-26T07:42:48.063 回答
2

我会做类似的事情:

List<ParameterClass> parameters = new ArrayList<ParameterClass>();
parameters.add(new ParameterClass("name1"));
parameters.add(new ParameterClass("name2"));

这将删除您的参数变量,并解决您的问题。

当然,您需要有一个以 name 作为参数的构造函数,但我认为这是一个公平的游戏。

于 2013-05-26T07:45:20.907 回答
1

在这段代码中

ParameterClass param = new ParameterClass();

param 只是对 new() 创建的对象的引用。当您再次调用 new() 时,引用将指向新创建的对象。所以你可以说引用在这里是一种虚拟,因为你的意图是填充 ArrayList。

从某种意义上说,这其实是正确的做法。当你说parameters.add(param); 实际发生的是另一个引用被创建并指向你的旧对象。现在您可以自由地将旧引用指向您创建的任何新对象。

于 2013-05-26T07:42:27.657 回答
1

是的,如果这是您使用此变量的所有代码,则可以接受

当您声明和初始化第一个时,编译器编写代码为 param 变量指向的实例保留一块内存区域,您使用该变量来设置属性,

ParameterClass param = new ParameterClass();
param.setName("name1");
parameters.add(param);

然后你声明并初始化另一个内存区域并使用相同的变量指向这个区域,但它是一个完全不同的区域,没有办法将两者混合

param = new ParameterClass();
param.setName("name2");
parameters.add(param);

当然,您需要将对这些区域的引用传递给某个容器对象,以便以后能够检索它们

于 2013-05-26T07:42:28.973 回答
1

要么按照明宇描述的方式(=根本不使用名称),另一种可能性是缩小名称的范围:

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。

这也是“复制和粘贴安全”,因为这样的错误很难发现:

ParameterClass param = new ParameterClass();
List<ParameterClass> parameters = new ArrayList<ParameterClass>();
param.setName("name1");
parameters.add(param);

param.setName("name2");
parameters.add(param);
于 2013-05-26T08:16:40.797 回答
1

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

于 2013-05-26T07:40:46.570 回答