Java 使用方法“;getValue();或获得财产”;价值观;?

Java 使用方法“;getValue();或获得财产”;价值观;?,java,methods,properties,Java,Methods,Properties,我是Java的初学者,所以这听起来像是一个简单而愚蠢的问题: 在Java中,使用方法获取属性值还是只使用属性本身更好? 要了解我的意思,请从about(关于)中的页面查看此示例: 我的一些推理是基于我有限的编程知识的假设,因此如果我错了,请纠正我 是否有我遗漏的东西,使用方法获取属性值的原因?还是仅仅作为一个例子?因为不需要调用方法和减慢程序的速度似乎要简单得多 非常感谢您的任何想法。参考:有效Java项目14在公共类中,使用访问器方法,而不是公共字段 如果类可在其包外访问,请提供访问器 方法,

我是Java的初学者,所以这听起来像是一个简单而愚蠢的问题:

在Java中,使用方法获取属性值还是只使用属性本身更好?

要了解我的意思,请从about(关于)中的页面查看此示例:

我的一些推理是基于我有限的编程知识的假设,因此如果我错了,请纠正我

是否有我遗漏的东西,使用方法获取属性值的原因?还是仅仅作为一个例子?因为不需要调用方法和减慢程序的速度似乎要简单得多

非常感谢您的任何想法。

参考:有效Java项目14在公共类中,使用访问器方法,而不是公共字段

如果类可在其包外访问,请提供访问器 方法,以保持更改类的内部 代表性。如果一个公共类公开了它的数据字段,那么 更改其表示形式将丢失,因为客户端代码可能会被分发 到处都是


出于安全原因,不建议使用公共属性,这就是为什么我们使用
get
set
方法的原因。通过这种方式,您只能获取/设置要使用的属性changed@DavidZhou为什么不呢?特别是对于小的、不重要的小程序,比如他们展示的和我制作的,这样可以吗?在Java中,“福音”通常是“通过访问器访问的私有成员”。有时,访问器是完全无用的,只不过是样板代码。你是否应该为更大的项目、团队项目等做准备?通常它们总是100%需要还是有意义?不,有时候它们是毫无意义的。不,也许吧。该理论认为,应“保护”财产不被任意访问/修改。即使getter和setter只是进行简单的输入输出拷贝。当您对此提出疑问时,会提出这样的论点,即在将来的某个时候,您可能希望保护该值不被任意访问,或者使用检查或日志代码或类似的代码来包围它。这个论点是正确的,但在许多情况下,它太弱,无法真正证明增加的复杂性。有一个正确的论点,即如果访问标准化,在大型应用程序中编码要简单得多。如果直接访问某些属性,而通过setter/getter访问其他属性,则很难知道在特定情况下如何访问属性。对我来说,这是始终使用setter/getter的最有说服力的理由,但在某些情况下(尤其是紧密连接的代码和较小的应用程序),这还不足以覆盖直接访问的简单性。
processPersons(
    roster,
    p -> p.getGender() == Person.Sex.MALE
        && p.getAge() >= 18
        && p.getAge() <= 25,
    p -> p.printPerson()
);
public class Person {
    public String name;
    public int age;
    public String gender;
    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        // assign some other properties for "printperson()" to print out
    }
    public String printPerson() {
        return name;    // and maybe return some other values
    }

    // need the methods below just to return property values??? are they unnecessary??
    public String getGender() {
        return this.gender;  // can't they use "p.gender" to get this value?
    }
    public int getAge() {
        return this.age;     // can't they use "p.age" to get this value?
    }
}