首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从另一个类获取变量的正确方法

从另一个类获取变量的正确方法
EN

Stack Overflow用户
提问于 2012-02-09 22:41:05
回答 6查看 98.2K关注 0票数 9

我可以用两种方式调用变量。

一种是像这样做:

MyClass myClass = new MyClass();    

myLocalVar = myClass.myVarVal;

另一种方法是使用这样的getter:

myLocalVar = myClass.getMyVarVal();

这两种方法都工作得很好,但我想知道做这件事最有效/最合适的方法是什么?

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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的一部分。

票数 16
EN

Stack Overflow用户

发布于 2012-02-09 22:42:35

出于encapsulation的考虑,您应该始终使用第二种方法。

myLocalVar = myClass.getMyVarVal();

效率方面,你很可能不会注意到不同之处。

票数 8
EN

Stack Overflow用户

发布于 2012-02-09 22:43:22

一定要使用getter和setter来访问你的属性!

您还应该看看this

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9212861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档