即使访问本地状态,始终使用访问器方法是最佳做法吗?

时间:2010-12-03 15:26:29

标签: java

考虑以下课程:

public class Person 
{
private Integer age;

// Standard Accessors
public Integer getAge() {
    return age;
}

public void setAge(Integer age) {
    this.age = age;
}

public String getAgeAsTextString()
{
    if (this.age == 20)
    {
        return "Twenty";
    }
    return "Unknown";
}
}

我只有1个整数和2个访问者。如果我想创建一个将对象的状态作为String返回的实用程序方法,最好将类变量引用为this.age,还是应该使用getAge()

是否有最佳做法,还是由于开发人员的压制?

11 个答案:

答案 0 :(得分:7)

我认为这取决于开发人员的自由裁量权。

我稍微喜欢使用getter方法。如果你有一个类层次结构,最好通过受保护的getter公开内部状态。

答案 1 :(得分:7)

取决于。对于访问者什么都不做的小型快速课程,我想说直接使用字段。对于访问者和setter可能有副作用的较大类,我会说使用访问器。

在Android平台上,Android文档似乎同意。在某些情况下,它们甚至可以推荐包级别保护。请参阅http://developer.android.com/guide/practices/design/performance.html中标题为“避免内部获取者/设置者”和“使用内部类的包范围”的部分。

这完全取决于环境,代码的大小,以及是否存在代码维护原因的商定“标准”。只知道有一些微小的性能差异,但最终还是由开发人员/团队决定。

答案 2 :(得分:3)

这是一个很好的做法,因为你永远无法确定如何在以后改变年龄。它可能需要进行某种验证或其他方式,并且在一种方法中更改它比使用字段的任何地方更容易(并且更容易错过使用它的一个地方,因此在追踪潜在错误时遇到一些困难)。

答案 3 :(得分:3)

如果你的课程是最终的,我会直接访问这些字段。相信你的重构能力。如果你想稍后改变它,你总是可以做到。

答案 4 :(得分:2)

我喜欢使用getter和setter,即使是简单的类,因为它在代码中创建了“Hooks”,使其易于扩展。因此,如果您想在每次用户更改某个对象属性时创建审核条目 - 这很容易做到。然后,当我到达项目结束时,我会花一点时间删除我没有使用的getter和setter。我觉得这很有效,因为大多数IDE会为你生成访问器,所以浪费的时间不多......

我看到有人发帖,“如果你想稍后更改,你总能做到。”。当您在整个代码中直接访问对象属性时,这在大型项目中并不总是微不足道。

答案 5 :(得分:2)

对于上帝的爱,不要用狡猾的“自我封装”来破坏你的代码。这门课是你的模块。让你的课堂变得简单。

另外,根据行为而不是数据设计您的类的界面。放弃那些获取和设置方法。

答案 6 :(得分:1)

通常人们会在一个简单的类中使用this.age,但考虑使用访问器时的好处。如果你想介绍一天,例如,当某人获得年龄时记录,你必须把它放在你称之为this.age的每一个地方。或者,您可以将其放入访问器中。代码风格并不总是固定的,但通常有一个很好的理由,如果你寻找它。

答案 7 :(得分:1)

要记住一件事。当使用像Hibernate这样的东西时,使用访问器通常是必需的!已被这一次咬了几次。 Hibernate使用字节代码生成来进行延迟初始化。如果直接访问成员变量,则将跳过延迟加载并获取空值。所以,我个人的最佳做法是使用访问者。当然,像所有最佳实践一样,有时候会忽略它,但是你去了。

答案 8 :(得分:1)

访问者“可以”成为更好选择的几个原因:

  1. 您正在使用模拟框架来测试您的代码,并希望能够同时更改从getter返回的值,并断言它已被调用。
  2. 您希望将大多数(如果不是全部)公共类公开为接口(例如,您希望能够创建动态代理等)。这可能包括在界面中公开访问者(调用者不需要知道它只是检索本地属性)。
  3. 您正在开发一个供公众使用的库,并且“简单的重构”不合适,因为它可能(将)导致最终用户的应用程序中的编译时错误。可以适当地弃用访问者,而不会影响早期库用户的行为。
  4. 您希望保留稍后更改访问者行为的权利,或者在未完全删除访问者类别的情况下更改访问者的行为(请参阅上一点)。
  5. 许多依赖注入框架都希望“bean”符合JavaBeans规范,因此具有所有属性的访问权限。

答案 9 :(得分:0)

恕我直言:我遵循You-Aint-Gonna-Need-It原则,保持简单。许多开发人员担心,有一天,你可能需要一个吸气剂或二传手,实际上这种情况从未发生过。

你应该做你认为最清楚的事情,特别是那些必须维护你的代码的人。

我建议使用int是个好习惯,除非你需要将值设置为null或对象。如果您需要将值强制为null,则应测试它。

即。任

int age = 10;
if (this.age == 20) // cannot be null.

OR

Integer age = 10;
if (this.age != null && this.age == 20) // age can be null

请注意

Integer age;
if (this.age == 20) // throws an NPE.

答案 10 :(得分:0)

虽然访问器可以为您的类添加代码行,但它们在重构代码时确实增加了价值。您需要通知另一个类属性已更改? BAM!有一个事件并在访问者代码中触发它。

只需使成员变量可访问,您就必须在需要创建事件时创建访问者,或者记住在每次类外的对象更改成员变量时附加逻辑以通知对象。

我认为访问器非常适合于复杂性比率的灵活性。另外,一些框架,如hibernate需要它们。此外,像.net这样的语言具有代码结构,例如无法应用于成员变量的属性(也称为WCF DataMember)。

希望有所帮助!