我可以用2种方式调用变量.
一个就是这样做:
MyClass myClass = new MyClass();
myLocalVar = myClass.myVarVal;
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用这样的getter:
myLocalVar = myClass.getMyVarVal();
Run Code Online (Sandbox Code Playgroud)
两种方式都运行良好,但我想知道最有效/最合适的方法是什么?
谢谢
DwB*_*DwB 13
这两种技术都很糟糕,但使用吸气剂是常见的(也是更安全的)做法.
要访问类的公共数据成员(也称为公共字段或公共属性),您必须知道类的实现详细信息(数据成员名称和数据成员类型).这是件坏事; 它打破了OOP概念"信息隐藏"并增加了"耦合".
使用getter也很糟糕(就像在糟糕的OOP实践中一样)因为对象不仅仅是数据包装器; 对象应该封装功能和数据."将此存储在这里,以便我以后可以得到它"不是功能; 它是hoot功能(就像在笼子里的猴子一样).吸气剂是; 但是,java中的公认实践(以及其他OOP-lite语言,如c ++和c#).
为免你认为我是象牙塔最纯净,当然我使用吸气剂; 我使用java,所以我使用getter.
吸气剂可以完成工作(没有双关语),只是不要相信"IR gud OOP Prgmr",因为如果你使用吸气剂你不是一个"好的oop程序员",你只是一个程序员得到的完成工作.
编辑:也许是一种更好的方式.
更好的方法是不使用getter,而是设计类,以便它们暴露功能而不是数据.在实践中,有一个地方会崩溃; 例如,如果需要在JSP页面上显示地址,则将bean放在请求(或会话或blah)中,并使用地址并使用getter公开值."更纯粹的纯粹"方式是将暴露的"bean显示在jsp上的地址"功能.
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)
}
}
Run Code Online (Sandbox Code Playgroud)
现在说我从表单中的网页获得一个电话号码作为输入String inputPhoneNumber.出于讨论的目的,接收此输入的类称为"servlet".
我该如何回答这个问题:"我的CustomerPhoneNumber对象列表中的输入电话号码是?"
选项1是使npa,nxx和serviceNumber数据成员公开并访问它们.这很糟糕.
选项2提供npa,nxx和服务号的getter,并将它们与输入进行比较.同样可怕的是,太多的内部细节暴露无遗.
选项3提供了一个getter,它返回格式化的电话号码(我在上面称之为toString()).这更聪明但仍然很糟糕,因为servlet必须知道getter将使用的格式并确保输入的格式相同.
选项4(我称之为"欢迎使用OOP")提供了一个接受String的方法,如果匹配客户服务号,则返回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);
}
Run Code Online (Sandbox Code Playgroud)
这是赢家,因为没有公开实施细节.此外,toString可用于在JSP页面上输出电话号码.
StringUtils是Apache Commons Lang的一部分.
为了封装,你应该总是选择第二种方法.
myLocalVar = myClass.getMyVarVal();
Run Code Online (Sandbox Code Playgroud)
效率明智,你很可能不会注意到差异.
| 归档时间: |
|
| 查看次数: |
76972 次 |
| 最近记录: |