我可以用两种方式调用变量。
一种是像这样做:
MyClass myClass = new MyClass();
myLocalVar = myClass.myVarVal;
另一种方法是使用这样的getter:
myLocalVar = myClass.getMyVarVal();
这两种方法都工作得很好,但我想知道做这件事最有效/最合适的方法是什么?
谢谢
发布于 2012-02-09 22:59:18
这两种技术都很糟糕,但使用getter是一种常见的(也是更安全的)实践。
为了访问公共数据成员(又称公共字段或公共属性),您必须知道类的实现细节(数据成员名称和数据成员类型)。这是一件坏事;它打破了OOP的“信息隐藏”概念,增加了“耦合性”。
使用getter也很糟糕(就像在糟糕的OOP实践中一样),因为对象不仅仅是数据的包装器;对象应该封装功能和数据。“将此值存储在此处,以便稍后获取”不是功能,而是hoot功能(就像笼子里的猴子在叫)。不过,在java (以及其他面向对象的轻量级语言,如c++和c#)中,Getters是一种公认的实践。
为了避免你认为我是最纯粹的象牙塔,我当然会使用getter;我使用java,所以我使用getter。
Getters可以很好地完成工作(不是双关语),只是不要相信"I R gud OOP Prgmr",因为如果你使用getter,你就不是一个“好的oop程序员”,你只是一个完成工作的程序员。
编辑:也许是一种更好的方式。
更好的方法是不使用better,而是设计您的类,以便它们公开功能而不是数据。在实践中,这是有问题的;例如,如果您需要在JSP页面上显示一个地址,您可以在请求(或会话或诸如此类)中放置一个具有该地址的bean,并使用getter公开这些值。一种“更纯粹的oop”方法是放置一个公开了“在jsp上显示地址”功能的bean。
Edit2:也许是一个更好的例子。
假设我在美国的一家电话公司工作,我有一个表示客户电话号码的对象。这可能如下所示:
public class CustomerPhoneNumber
{
private String npa; // numbering plan area (google search nanp for more details)
private String nxx; // exchange.
private String serviceNumber;
public String toString()
{
return "(" + npa + ") " + nxx + "-" + serviceNumber;
}
public boolean equals(Object object)
{
... standard equals implementation (assume this works)
}
}
现在,假设我从表单String inputPhoneNumber
的网页中获得了一个电话号码作为输入。为了便于讨论,接收此输入的类称为“servlet”。
我如何回答这个问题:“输入的电话号码是否在我的CustomerPhoneNumber对象列表中?”
选项1是使npa、nxx和serviceNumber数据成员公开并访问它们。这太可怕了。
选项2是为npa、nxx和服务编号提供getter,并将它们与输入进行比较。同样可怕的是,太多的内部细节暴露了出来。
选项3是提供一个返回格式化电话号码的getter (我在上面调用了这个toString() )。这更聪明,但仍然很糟糕,因为servlet必须知道getter将使用的格式,并确保以相同的方式格式化输入。
选项4(我称之为"Welcome to OOP")提供了一个方法,该方法接受一个字符串,如果字符串与客户服务编号匹配,则返回true。这样更好,可能看起来像这样(名称很长,但对于本例来说已经足够了):
public boolean doesPhoneNumberMatchThisInput(final String input)
{
String formattedInput;
String formattedCustomerPhoneNumber = npa + nxx + serviceNumber;
formattedInput = ... strip all non-digits from input.
return StringUtils.equals(formattedCustomerPhoneNumber, formattedInput);
}
这是赢家,因为没有公开任何实现细节。此外,toString还可用于在JSP页面上输出电话号码。
StringUtils是Apache Commons Lang的一部分。
发布于 2012-02-09 22:42:35
发布于 2012-02-09 22:43:22
一定要使用getter和setter来访问你的属性!
您还应该看看this。
https://stackoverflow.com/questions/9212861
复制相似问题