Java 即使在访问本地状态时,始终使用访问器方法是否是最佳实践?
考虑以下类别:Java 即使在访问本地状态时,始终使用访问器方法是否是最佳实践?,java,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) {
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个访问器。如果我想创建一个以字符串形式返回对象状态的实用程序方法,那么最好将类变量引用为this.age
,还是使用getAge()
是否有一个最佳实践,还是因为开发人员的随意性?这是一个很好的实践,因为你永远无法确定你希望在以后的日子里年龄会发生怎样的变化。它可能需要某种形式的验证或其他东西,在一种方法中更改它比在使用字段的任何地方都要容易(而且很容易错过它使用的地方,因此很难跟踪潜在的错误)。我认为这取决于开发人员的判断
我稍微喜欢使用getter方法。如果你有一个类层次结构,通过受保护的吸收器来公开内部状态是很好的。
人们经常这样做。年龄在一个简单的类中,但是考虑使用访问器时已经拥有的好处。如果你想有一天,比如说,当某人达到年龄时,你必须把它放在每一个你称之为this.age的地方。或者,您可以将其放在访问器中。代码风格并不总是固定不变的,但如果你寻找它,通常会有一个很好的理由。
伊姆霍:我遵循“你不需要它”的原则,即保持简单。许多开发人员担心有一天,您可能需要一个getter或setter,而实际上这种情况从未发生过 你应该做你认为最清楚的事情,尤其是那些必须维护你的代码的人 我建议最好使用int,除非您需要值为null或对象。如果需要将该值设置为可能为null,则应进行测试 i、 e.要么int age = 10;
if (this.age == 20) // cannot be null.
或
注
如果你的类是最终类,我会直接访问字段。信任你的重构能力。如果您以后想更改它,您总是可以这样做。视情况而定。对于访问器不执行任何操作的小型快速类,我会说直接使用字段。对于访问器和setter可能有副作用的较大类,我会说使用访问器 在安卓平台上,安卓文档似乎是一致的。在某些情况下,他们甚至建议提供包级保护。请参阅中标题为“避免内部getter/setter”和“将包作用域与内部类一起使用”的部分
这一切都取决于环境、代码的大小,以及是否有出于代码维护原因而商定的“标准”。只需知道性能上存在一些微小的差异,但最终取决于开发人员/团队。即使对于简单的类,我也喜欢使用getter和setter,因为它会在代码中创建“hook”,从而易于扩展。因此,如果您想在用户每次更改某个对象属性时创建审核条目,这很容易做到。然后,当我的项目结束时,我将花一点时间删除我没有使用的getter和setter。我觉得这很有效,因为大多数IDE都会为您生成访问器,所以不会浪费太多时间
我看到有人发帖说,“如果你以后想更改它,你总是可以的。”。在大型项目中,当您在整个代码中直接访问对象属性时,这并不总是微不足道的。看在上帝的份上,不要用自相矛盾的“自我封装”来搞乱您的代码。该类是您的模块。让你的课变得简单
另外,根据行为而不是数据来设计类的接口。放弃那些获取和设置方法。有一件事要记住。当使用Hibernate之类的工具时,通常需要使用访问器!我已经被这个咬过几次了。Hibernate使用字节码生成来执行延迟初始化。如果直接访问成员变量,将跳过延迟加载并获得空值。因此,我个人的最佳实践是使用访问器。当然,就像所有的最佳实践一样,有时我们也会忽略它,但情况就是这样。当访问器向类中添加代码行时,它们在重构代码时确实会增加价值。您需要通知另一个类某个属性已更改吗?砰!在访问器代码中有一个事件并触发它 只要使成员变量可访问,就必须在需要创建事件时创建访问器,或者记住每次类外的对象更改成员变量时都要附加逻辑来通知对象 我认为访问器的灵活性和复杂性比非常好。另外,有些框架,如hibernate需要它们。另外,像.net这样的语言有一些无法应用于成员变量(也称为WCF DataMember)的属性等代码结构
希望有帮助 访问器“可以”成为更好选择的几个原因:
Integer age = 10;
if (this.age != null && this.age == 20) // age can be null
Integer age;
if (this.age == 20) // throws an NPE.