Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 即使在访问本地状态时,始终使用访问器方法是否是最佳实践?_Java - Fatal编程技术网

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)的属性等代码结构


希望有帮助

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

  • 您正在使用模拟框架来测试代码,并且希望能够更改从getter返回的值,并断言调用了它
  • 您希望将大多数(如果不是全部)公共类公开为接口(例如,您希望能够创建动态代理等)。这可能包括在接口中公开访问器(调用方不需要知道它只是在检索本地属性)
  • 您正在开发一个供公众使用的库,而“简单重构”并不合适,因为它可能(将)在最终用户的应用程序中导致编译时错误。可以适当地弃用访问器,而不会影响早期库用户的行为
  • 您希望保留在以后更改访问器行为的权利,或者保留在派生类中更改访问器行为的权利,而不完全删除它(请参见前一点)
  • 许多依赖注入框架都希望“bean”符合JavaBeans规范,因此
    Integer age = 10;
    if (this.age != null && this.age == 20) // age can be null
    
    Integer age;
    if (this.age == 20) // throws an NPE.