Java 在类方法中访问类属性的良好实践是什么?

Java 在类方法中访问类属性的良好实践是什么?,java,setter,getter,Java,Setter,Getter,我总是想知道在Java中从类方法访问类属性的最佳方法 你能很快让我相信下面三种解决方案中的哪一种(或者完全不同的:p)是一种好的做法吗 public class Test { String a; public String getA(){ return this.a; } public setA(String a){ this.a = a; } // Using Getter public void

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

你能很快让我相信下面三种解决方案中的哪一种(或者完全不同的: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);
    }
}

使用getter和setter是一种方法

  • 这是普遍接受的做法
因此,其他程序员更可能理解您的代码

  • 它为类作者提供了将来的选项
假设您想阻止某人将a设置为null。暴露成员,你永远无法做到这一点

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


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

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

我会同意

System.out.println(getA());

原因很简单,如果您想更改属性的访问方式或强制执行变量设置的任何约束,只需更改getA或setA方法即可


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

如果只返回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();
}
...
。。。
公共列表getList(){
if(this.list==null){
this.list=新建LinkedList();
}
返回此.list;
}
public int getListSize(){
返回getList().size();
}
...

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

这完全取决于getter和setter正在做什么。如果它们不仅仅是获取和设置值(应该在方法的Javadoc中显式地记录),那么在类内部选择什么方式将真正起作用。但是,如果它们是纯Javabean式的getter/setter,那么我宁愿通过
a
this.a
直接访问变量,这取决于作用域中是否有一个具有该名称的局部变量

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


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

解决方案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;
}
您将只在一个地方进行更改,而不是在访问字段的任何地方进行更改。添加
完全取决于您自己的个人风格或项目标准。就个人而言,我不喜欢它,因为它是不必要的,只是妨碍了可读性,但对其他人来说,它使方法/字段的所有者更清晰。

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

getter和setter是接口的一部分。方法已具有对状态的完全访问权限。坦白说吧


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

问题不是让变量可见,而是如何最好地从类本身访问成员变量,直接访问或使用getter和setter。从类本身访问变量的最佳方法是直接访问它们。如果您需要访问一个变量,并通过创建公共setter/getter来解决这个问题,那么您就是在公开内部实现!祝贺现在你把自己锁在外面了。您不能再更改内部结构,因为它是公开的,其他类依赖于访问器方法。延迟加载不应该是类本身的问题。如果是,那么我宁愿将加载移到类的构造函数;o) 出于好奇:您将如何使用延迟加载?由外部的设置者执行?注意:您可以在评论中使用
@昵称
,通知评论者对评论的回复。如果加载只是类外调用方的一个问题,那么我将保持延迟加载不变,并摆脱
getListSize()
。如果您需要从类内部调用
getList()
,那么我宁愿将加载移到类的构造函数中,并访问
this.list
。您是否担心以后可能需要更改某些设置的方式?也许忘了在你自己做过的20次中的一次中改变它的方式?如果设置变量比“a=(stuff)”更复杂,重构最终会得到一个setA()。你不清楚什么是接口
private String postcode;
public String getPostcode()
{
   return postcode != null? postcode.toUppercase() : null;
}