封装冗余设置器

我有一个最近发现包含冗余代码的编码。如果我将Setter留在(第18-21行)中,例如sumnr,它仍然运行良好。因此该代码似乎是不必要的。 但是,如果我将this.sumnr = sumnr;(第11行)留在外面,而将Setter留在原地,那将不起作用。为什么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...

GUDUNVHAI 回答:封装冗余设置器

因为Java从来没有在后台神奇地 自动调用设置器(某些语言可以或似乎可以)。如果在构造函数中编写this.sumnr = sumnr;,则不会用对setter的调用代替。如果您有一个二传手,除非您在构造函数中写了对它的实际调用,否则它不会调用它。

如果您想在第11行使用设置器,则需要将其替换为:

this.setSumnr(sumnr);

尽管在构造函数中调用方法通常不是最佳实践(尽管有些人认为二传手是对该规则的一种豁免,但有些人则不然)。

如果我将Setter留在外面(第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
    }
}

当然,实际上不是在课外的代码。它是设置器中的代码。但是可以在课堂外调用设置器。

没有设置器,类外的代码无法直接设置值:

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。类外没有代码可以(不使用反射,但这是一个不同的话题)。

本文链接:https://www.f2er.com/2829436.html

大家都在问