我有一个最近发现包含冗余代码的编码。如果我将Setter
遗漏(第18-21行)例如。 sumnr
,它仍然运行良好。因此,该代码似乎是不必要的。
但是,如果我将this.sumnr = sumnr;
(Line11)留在原处,而将Setter留在原地,那将是行不通的。为什么设置行18-21中的this.sumnr = sumnr
不能由设置者备份?
有人知道吗?
public class SortSums {
private int sumnr;
private int part1;
private int part2;
private int result;
private int answer;
private String sign;
public SortSums(int somnr, int part1, int part2, int result, String sign)
{
this.sumnr = sumnr; // LINE11 this line however, seems indispensible.
this.part1 = part1; // idem
this.part2 = part2;
this.result = result;
this.sign = sign;
}
public void setSumnr(int sumnr) // LINE18 it seems that this 'void' method is redundant.
{
this.sumnr = sumnr;
} // LINE21
public int getSumnr()
{
return sumnr;
}
//etc...
最佳答案
因为Java永远不会在幕后自动神奇地调用设置器(某些语言会或似乎会)。如果在构造函数中编写this.sumnr = sumnr;
,它不会替代对setter的调用。如果您有一个setter,除非您在构造函数中编写了对它的实际调用,否则它将不会调用它。
如果要在第11行上使用设置器,则需要将其替换为:
this.setSumnr(sumnr);
但是,从构造函数内部调用方法通常不是最佳实践(尽管有些人认为二传手是该规则的一种豁免,而其他人则不是)。
如果我遗漏了二传手(第18-21行),例如。 sumnr,它仍然运行良好。因此,该代码似乎是不必要的。
不必要。这完全取决于是否要在创建
sumnr
对象之后允许更改SortSums
。如果这样做,您将需要二传手。如果您不这样做,请忽略它。Andreas在his comment中说得很好:构造函数用于设置字段的初始值。设置程序用于在以后需要时将该值更改为其他值。
在评论中,您说过:
如果我禁用该无效部分。 (Sumnr是在代码的另一部分中增加的计数器),该sumnr只会被更改。无论我是否离开空虚的二传手。这一切对我来说似乎还不清楚。
对。您不需要设置器即可在
sumnr
代码中更改SortSums
字段的值;您可以直接分配给它。设置程序的目的是允许SortSums
之外的代码设置sumnr
字段(如果您希望这样做)。如果您不希望这样做,请不要使用设置器。让我们简化一下。
使用setter,类外的代码可以直接更改字段:
class WithSetter {
private int value;
public WithSetter(int value) {
this.value = value;
}
public void setValue(int value) {
this.value = value;
}
public void incrementValue() {
++this.value;
}
public int getValue() {
return this.value;
}
}
class ExampleWith {
public static void main(String[] args) {
var w = new WithSetter(0);
w.incrementValue();
System.out.println(w.getValue()); // 1
w.setValue(7); // <=== Works just fine
System.out.println(w.getValue()); // 7
}
}
当然,实际上不是在课外的代码。它是设置器中的代码。但是二传手可以在课外被调用。
没有setter,类外的代码无法直接设置值:
class WithoutSetter {
private int value;
public WithoutSetter(int value) {
this.value = value;
}
public void incrementValue() {
++this.value;
}
public int getValue() {
return this.value;
}
}
class ExampleWithOut {
public static void main(String[] args) {
var w = new WithoutSetter(0);
w.incrementValue();
System.out.println(w.getValue()); // 1
w.setValue(7); // <=== Won't compile
w.value = 7; // <=== Also won't compile
System.out.println(w.getValue());
}
}
在
WithoutSetter
中,只有类中的代码才能更改value
。类外没有代码可以(不使用反射,但这是一个不同的主题)。