我总是想知道从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);
}
}
答案 0 :(得分:3)
这完全取决于吸气者和制定者正在做什么。如果他们做的不仅仅是获取和设置值(应该在方法的Javadoc中明确记录),那么它将真正改变你在类中选择的方式。但是如果它们像getter / setter一样纯粹是Javabean,那么我宁愿直接通过a
或this.a
来访问变量,具体取决于范围内是否存在具有该名称的局部变量。
就个人而言,我只是根据Javabean规范保持getter和setter“pure”,并且每当我想做更多的事情而不仅仅是获取/设置值时,添加另一个带有自解释方法名称的getter或setter。例如。 getAndIncrement()
,getAsString()
,setAsInt(String)
等
品味问题。只要你在整个编码过程中与它保持一致,它就不会真正受到伤害。
答案 1 :(得分:2)
如果您需要在将来创建任何验证,您将需要一个setter / getter。当您使变量可见时,您可以制动类封装。从理论上讲,这意味着你的代码不是面向对象的:P,但实际上你失去了执行大量代码重构的能力。例如,提取界面。 对于这个电话,我认为它是多余的,但那只是我:)。
答案 2 :(得分: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可以是局部变量和类属性。
答案 3 :(得分:-1)
解决方案2或3是最佳实践,因为它们为现场提供封装。例如,如果字段'a'
是用户的邮政编码,并且您的应用程序有新要求始终将邮政编码返回为大写,那该怎么办?使用解决方案2或3,这变得微不足道。 E.g。
private String postcode;
public String getPostcode()
{
return postcode;
}
变为
private String postcode;
public String getPostcode()
{
return postcode != null? postcode.toUppercase() : null;
}
并且您只能在一个地方进行更改,而不是在访问该字段的任何地方进行更改。 this
的添加纯粹取决于您自己的个人风格或项目标准。就个人而言,我不喜欢它,因为它是不必要的,只是妨碍了可读性,但对于其他人来说,它使得方法/领域的所有者更加清晰。
答案 4 :(得分:-1)
使用setA(b + c)
很愚蠢。
Getters和setter是界面的一部分。方法已经完全访问该州。坦率地说。
如果您担心自己可能会破坏不变量,那么您的课程对您来说太复杂了。(承认并重构。)
答案 5 :(得分:-2)
使用getter和setter是可行的方法。
所以其他程序员更有可能理解你的代码。
假设您要阻止某人将a设置为null。公开会员,你永远不会这样做。
至于是否使用this
- 我尝试始终如一地使用this
使其对任何其他实例成员非常清楚,并且在任何时候都是局部变量 - 也有助于避免意外阴影,但我认为这不太重要,更像是一种风格。
另外 - this.a
是一个实例成员(每个实例一个)不是类成员(每个类一个,是静态的)。使用this
明确的另一个原因。
答案 6 :(得分:-2)
我会选择
System.out.println(getA());
和
setA(b + c);
原因很简单,如果您想要通常更改访问属性的方式或强制执行有关可以设置变量的任何约束,则只需更改getA或setA方法即可。
除非我需要明确区分同名变量,否则我不喜欢使用它。