【问题标题】:Use method "getValue()" or get property "value"? [duplicate]使用方法“getValue()”还是获取属性“value”? [复制]
【发布时间】:2014-08-29 18:15:19
【问题描述】:

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

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

要了解我的意思,请查看来自Oracle Java Tutorials 的关于Lambda Expressions 的页面中的此示例:

processPersons(
    roster,
    p -> p.getGender() == Person.Sex.MALE
        && p.getAge() >= 18
        && p.getAge() <= 25,
    p -> p.printPerson()
);

我只是想知道,当仅使用 p.genderp.age 应该具有正确的值时,唤起 p.getGender()p.getAge() 有什么用?它们不能有多个值或任何可能阻止它们仅使用属性的东西。 (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?
    }
}

我的一些推理是我有限的编程知识的假设,所以如果我错了请纠正我

我是否缺少某些东西,为什么要使用方法来获取属性值?或者它只是作为一个例子?因为不必调用方法并减慢程序速度似乎要简单得多。

感谢任何想法。

【问题讨论】:

  • 出于安全原因不建议使用公共属性,这就是我们使用getset的方法的原因。这样,您只能获取/设置要更改的属性
  • @DavidZhou 为什么不呢?尤其是小的,不重要的小程序,比如他们展示的和我做的,会好吗?
  • 在 Java 中,“福音”通常是“通过访问器访问的私有成员”。有时,访问器完全没用,只不过是样板代码。您是否应该为大型项目、团队项目等设置获取器/设置器?通常。它们总是 100% 需要还是有意义?不。有时它们只是毫无意义。
  • 是的。和不。可能是。理论是该属性应该受到“保护”以防止任意访问/修改。即使 getter 和 setter 只是简单地进出复制。当您对此提出质疑时,会提出一个论点,即在未来的某个时候,您可能希望保护该值不被任意访问,或者用检查或记录代码等围绕它。这个论点是有效的,但在许多情况下,它太弱,无法真正证明增加的复杂性是合理的。
  • 有一个有效的论点是,如果访问标准化,大型应用程序中的编码会简单得多。如果某些属性是直接访问的,而其他属性是通过 setter/getter 访问的,那么在特定情况下很难知道如何访问属性。对我来说,这是始终使用 setter/getter 的最有说服力的论据,但在某些情况下还不足以覆盖直接访问的简单性(尤其是紧密连接的代码和较小的应用程序)。

标签: java methods properties


【解决方案1】:

参考: Effective Java Item 14 在公共类中,使用访问器方法,而不是公共字段。

如果一个类在其包之外可以访问,则提供访问器 方法,以保持更改类内部的灵活性 表示。如果一个公共类暴露了它的数据字段,所有希望 更改其表示会丢失,因为可以分发客户端代码 远方。

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 2014-04-11
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    相关资源
    最近更新 更多