Java 在同一类的方法中使用封装getter

Java 在同一类的方法中使用封装getter,java,encapsulation,setter,getter,Java,Encapsulation,Setter,Getter,我正在学习一门关于Java的课程,一个可能的考试问题的解决方案说明如下(在一个名为Parcel的课程中): 我理解为什么封装对国际事务有用:通过这样做,我们确保给定的值是我们想要的值,并在需要时抛出异常。但是,我不明白为什么您需要这样一种在getgetShippingPrice()方法中工作的方式。为什么您需要getterisInternational,为什么不使用international?在编写它们的同一个类中使用getter和setter有什么好处?我已经回答了后一个问题,至少部分回答了:

我正在学习一门关于Java的课程,一个可能的考试问题的解决方案说明如下(在一个名为Parcel的课程中):


我理解为什么封装对国际事务有用:通过这样做,我们确保给定的值是我们想要的值,并在需要时抛出异常。但是,我不明白为什么您需要这样一种在get
getShippingPrice()方法中工作的方式。为什么您需要getter
isInternational
,为什么不使用
international
?在编写它们的同一个类中使用getter和setter有什么好处?我已经回答了后一个问题,至少部分回答了:它使您能够更好地控制输入。但是为什么要使用getter呢?

我认为有两种情况

首先,您可以在将来的类继承中重写这些getter,这样这些getter就可以有另一个实现

另一种情况是,getter中的一些特殊逻辑,例如
null
字段可以获得初始值。此方法通常用于自动生成的
JAXB
-注释bean中集合字段的getter:

public List<String> getList() {
    if (this.list == null) {
        this.list = new ArrayList<>();
    }
    return this.list;
}
public List getList(){
if(this.list==null){
this.list=new ArrayList();
}
返回此.list;
}

当然,在类中访问它是没有用的,因为您将直接使用
国际
专用字段


但是想想消费者对这个
包裹
对象的看法。假设邮局需要决定它是需要运送到国际地点还是国内地点。为了让邮局做出区分,它不能直接访问包裹的私有字段,因此将进行
isInternational
调用,因此在
包裹
类中有getter方法。

字段的可见性可以是
私有
受保护
默认
(或包裹可见)和
公共
。如果您将字段设置为私有,因为您希望使用setter,那么您需要getter,因为它们仍然是私有的。这是一个原因,但一般来说,您希望将接口与实现分离,您不希望实际显示您有一个名为
international
的字段,并且您的类的客户机实际上不应该为实现而烦恼。所以,我的结论是,getter作为一种抽象。@nbro我理解这一点,但我不理解在这种特定情况下,为什么在字段的同一个类中使用getter。该字段是私有的,因此在该类中仍然可见。那么为什么需要getter呢?getter当然对外部类有用,而不是对同一类中的方法有用(一般来说)。当然,如果getter做了一些特殊的工作,那么getter在同一类的其他方法中也可能有用,但事实并非如此。@nbro所以我正确地认为在这种情况下使用getter没有任何优势,因为我们仍然在同一类中,getter没有做任何特殊的事情,比如Andremoniy的回答会暗示什么?在这种情况下没有优势?这个注释也让我感到困惑。在这种情况下,建议使用accessor方法,而不是直接访问变量。我不明白为什么。根据我的经验,如果getter只返回变量的值,那么它在类中就没有用处了,除非您希望对维护代码的程序员(以及您)也有抽象。当然,在将来,如果您想改变getter在内部的工作方式,那么您可以选择在类中也使用getter。但这并不能解释为什么在我给出的代码中使用getter。那里没有这样的事情发生。我理解,这不是我的问题。为什么教授在这门课上评论说,我们应该在getshippingprice中使用getter,即使该方法与private字段在同一个类中?邮局会根据包裹是否为国际包裹对其客户进行定价。你不明白。我明白了为什么必须有能手和二传手。但这并不是为什么在这种特定情况下,您会在与私有字段位于同一类中的方法中使用isInternational。无论如何,该字段可以通过该方法访问,您不需要getter。
public List<String> getList() {
    if (this.list == null) {
        this.list = new ArrayList<>();
    }
    return this.list;
}