Java 在类方法中访问类属性的良好实践是什么?
我总是想知道在Java中从类方法访问类属性的最佳方法 你能很快让我相信下面三种解决方案中的哪一种(或者完全不同的:p)是一种好的做法吗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
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是一种方法
- 这是普遍接受的做法
- 它为类作者提供了将来的选项
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;
}