我必须在Java中自己的类中使用getter方法吗?

我必须在Java中自己的类中使用getter方法吗?,java,coding-style,getter,getter-setter,private-members,Java,Coding Style,Getter,Getter Setter,Private Members,假设我有课: public class A { private int val = 0; public int getVal() { return val; } public void addFrom(A otherA) { this.val += otherA.val; if (otherA.val > 0) otherA.val = 0; else

假设我有课:

public class A {
    private int val = 0;

    public int getVal() {
        return val;
    }

    public void addFrom(A otherA) {
        this.val += otherA.val;
        if (otherA.val > 0)
            otherA.val = 0;
        else
            otherA = Math.abs(otherA.val);
    }
}
我应该使用getter方法来代替otherA的val变量吗?这样做更好吗

编辑:这是一个非常简化的类版本,需要花费太多的时间来阅读。但是假设有延迟初始化正在进行,有其他方法访问这个类,等等。我已经更新了示例方法,以便这可能更清楚,但我希望我的问题涉及访问其他对象的变量,并且想知道对不是“this”的东西使用直接变量访问是否是失礼的行为。

不,绝对不是

当您在类的成员中时,应该直接使用变量,并在其他任何情况下使用getter(因为
val
是私有的,所以可能会出现错误)。

不,绝对不是


当您在类的成员中时,应该直接使用变量,并在任何其他情况下使用getter(因为
val
是私有的,所以您可能会收到错误)。

public int getVal()
旨在将您的礼物(变量)放在一个盒子中呈现给外部世界(封装)。你会把礼物装在盒子里送给自己吗?这很奇怪,所以请按原样使用变量。

public int getVal()
旨在将您的礼物(变量)放在盒子里呈现给外部世界(封装)。你会把礼物装在盒子里送给自己吗?这很奇怪,所以请按原样使用变量。

您可以使用变量,但当前代码无法编译。可能,返回值应该是int而不是boolean


可能您的目的是从Compariable接口重写compareTo方法,您可以使用变量,但当前代码不编译。可能,返回值应该是int而不是boolean


很可能,您的意图是从可比较的接口重写compareTo方法,添加一个不必要的getter可以揭示内部结构,这是增加耦合的一个机会

真正封装良好的类没有setter,最好也没有getter。类应该负责使用其数据计算某些内容,然后返回结果,而不是要求类获取一些数据,然后使用这些数据计算某些内容


使用访问器来限制对字段变量的直接访问比使用公共字段更可取,然而,为每个字段设置getter和setter是过分的。不过,这也取决于具体情况,有时您只需要一个哑数据对象。应该为真正需要访问器的字段添加访问器。一个类应该公开碰巧使用其状态的更大行为,而不是由其他类操纵的状态存储库。

添加不必要的getter会揭示内部结构,这是增加耦合的机会

真正封装良好的类没有setter,最好也没有getter。类应该负责使用其数据计算某些内容,然后返回结果,而不是要求类获取一些数据,然后使用这些数据计算某些内容


使用访问器来限制对字段变量的直接访问比使用公共字段更可取,然而,为每个字段设置getter和setter是过分的。不过,这也取决于具体情况,有时您只需要一个哑数据对象。应该为真正需要访问器的字段添加访问器。一个类应该公开碰巧使用其状态的更大行为,而不是由其他类操纵的状态存储库。

我必须抵制编辑Superfloos
{
因为这不是主题…@dystroy我会帮你弄到的。好吧,这不是真正的问题,但我会建议改进。在你的比较方法中,只要让
返回this.val-otherA.val;
就行了。比较只需要符号,而不需要值。在内部使用getter的唯一原因是当它们执行像lazy I这样的神奇操作时初始化。你不想弄乱另一个的内部状态。可能重复的我必须抵制编辑掉superflous
{
因为这不是主题…@dystroy我会帮你弄到的。好吧,这不是真正的问题,但我会建议改进。在你的比较方法中,只要让
返回this.val-otherA.val;
就行了。比较只需要符号,而不需要值。在内部使用getter的唯一原因是当它们执行像lazy I这样的神奇操作时初始化。你不想弄乱对方的内部状态。可能重复+1的
你自己在盒子里送礼物吗?
我喜欢给自己一个惊喜。lol:)如果我和另一个和我类型相同但不等于我的东西互动呢?用你的类比,我应该不需要向他们索要这个盒子吗如果我和另一个和我类型相同但又不等同于我的东西打交道呢?用你的类比,我应该不需要向他们索要这个盒子,而不是仅仅去抢礼物吗?