4

我总是想知道从 Java 中的类方法访问类属性的最佳方法。

您能否快速说服我以下 3 种解决方案中的哪一种(或完全不同的一种:P)是一种好习惯?

public class Test {

    String a;


    public String getA(){
        return this.a;
    }

    public setA(String a){
        this.a = a;
    }

    // Using Getter
    public void display(){

        // Solution 1
        System.out.println(this.a);

        // Solution 2
        System.out.println(getA());

        // Solution 3
        System.out.println(this.getA());
    }


    // Using Setter
    public void myMethod(String b, String c){

        // Solution 1
        this.a = b + c;

        // Solution 2
        setA(b + c);

        // Solution 3
        this.setA(b + c);
    }
}
4

7 回答 7

4

这完全取决于 getter 和 setter 正在做什么。如果他们不仅仅是获取和设置值(应该在方法的 Javadoc 中明确记录),那么从类中选择哪种方式真的会有所不同。但是,如果它们是纯 Javabean,如 getter/setter,那么我宁愿直接访问该变量,a或者this.a取决于范围内是否存在具有该名称的局部变量。

就个人而言,我只会根据 Javabean 规范保持 getter 和 setter 的“纯”,并在我想做的事情不仅仅是获取/设置值时,添加另一个具有自我解释方法名称的 getter 或 setter。例如getAndIncrement(), getAsString(),setAsInt(String)等。

口味问题。只要您在整个编码过程中保持一致,它就不会真正有害。

于 2010-04-20T21:37:05.097 回答
2

如果您将来需要创建任何验证,您将需要一个 setter/getter 。当您使变量可见时,您会破坏类封装。从理论上讲,这意味着您的代码不是那么面向对象:P,但实际上您失去了进行大量代码重构的能力。例如,提取接口。对于这个电话,我认为它是多余的,但这只是我:)

于 2010-04-20T21:33:23.360 回答
0

如果只返回 this.value 涉及更多逻辑,我会在类中使用 getter 和 setter。这样我就避免了重复。一个例子:

...
public List<String> getList() {

    if (this.list == null) {
        this.list = new LinkedList<String>();
    }

return this.list;

}

public int getListSize() {
    return getList().size();
}
...

我总是使用“this”,因为它让其他人更容易阅读我的代码。毫无疑问,this.value 是类属性,而 value 既可以是局部变量,也可以是类属性。

于 2010-04-20T21:35:19.423 回答
-1

解决方案 2 或 3 是最佳实践,因为它们提供了对现场的封装。例如,如果该字段'a'是用户的邮政编码,并且您的应用程序有一个新要求,即始终以大写形式返回邮政编码,该怎么办。对于解决方案 2 或 3,这变得微不足道。例如

private String postcode;
public String getPostcode()
{
   return postcode;
}

变成

private String postcode;
public String getPostcode()
{
   return postcode != null? postcode.toUppercase() : null;
}

并且您只会在一个地方而不是访问该字段的任何地方进行更改。添加this完全取决于您自己的个人风格或项目标准。就个人而言,我不喜欢它,因为它是不必要的,而且只会妨碍可读性,但对其他人来说,它使方法/字段的所有者更加清晰。

于 2010-04-20T21:40:22.357 回答
-1

使用setA(b + c)是愚蠢的。

Getter 和 setter 是接口的一部分。方法已经拥有对状态的完全访问权限。坦率地说。

如果您担心可能会破坏不变量,那么您的类对您来说太复杂了。(承认并重构。)

于 2010-04-20T22:20:44.300 回答
-2

使用 getter 和 setter 是可行的方法。

  • 这是普遍接受的做法

所以其他程序员更有可能理解你的代码。

  • 它为班级作者提供了未来的选择

假设您想阻止某人将 a 设置为 null。暴露成员,你永远做不到。

至于是否使用this——我尝试this一致地使用以使其他任何人都清楚哪些是实例成员,哪些是局部变量——也有助于避免意外阴影,但我认为这不太重要,更多的是一种风格.

另外 -this.a是实例成员(每个实例一个)而不是类成员(每个类一个,将是静态的)。使用的另一个原因this要清楚。

于 2010-04-20T21:28:12.813 回答
-2

我会去

System.out.println(getA());

setA(b + c);

原因很简单,如果您想通常更改访问属性的方式或对可以将变量设置为的内容实施任何约束,您只需更改 getA 或 setA 方法。

我不喜欢使用它,除非我需要明确区分同名变量。

于 2010-04-20T21:34:11.167 回答