考虑以下课程:
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()
?
是否有最佳做法,还是由于开发人员的压制?
答案 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)
访问者“可以”成为更好选择的几个原因:
答案 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)。
希望有所帮助!