我有一个最近发现包含冗余代码的编码。如果我将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。类外没有代码可以(不使用反射,但这是一个不同的主题)。

10-07 12:55