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

时间:2012-02-09 14:41:05

标签: java

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

一个就是这样做:

MyClass myClass = new MyClass();    

myLocalVar = myClass.myVarVal;

另一种方法是使用这样的吸气剂:

myLocalVar = myClass.getMyVarVal();

两种方式都运行良好,但我想知道最有效/最合适的方法是什么?

由于

7 个答案:

答案 0 :(得分:12)

这两种技术都很糟糕,但使用吸气剂是常见的(也是更安全的)做法。

为了访问类的公共数据成员(a.k.a.公共字段或公共属性),您必须知道该类的实现细节(数据成员名称和数据成员类型)。这是件坏事;它打破了OOP概念“信息隐藏”并增加了“耦合”。

使用getter也很糟糕(如在糟糕的OOP实践中),因为对象不仅仅是数据包装器;对象应该封装功能和数据。 “将此存储在这里,以便我以后可以得到它”不是功能;它是hoot功能(就像在笼子里的猴子一样)。吸气剂是;但是,java中的公认实践(以及其他OOP-lite语言,如c ++和c#)。

为免你认为我是象牙塔最纯净,当然我使用吸气剂;我使用java,所以我使用getters。

Getters很适合完成工作(没有双关语),只是不要相信“IR gud OOP Prgmr”,因为如果你使用getter你不是一个“好的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)
  }
}

现在说我从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);
}

这是赢家,因为没有公开任何实施细节。此外,toString可用于在JSP页面上输出电话号码。

StringUtils是Apache Commons Lang的一部分。

答案 1 :(得分:8)

为了encapsulation,你应该总是选择第二种选择。

myLocalVar = myClass.getMyVarVal();

效率明智,你很可能不会注意到差异。

答案 2 :(得分:4)

始终使用getter和setter访问您的属性!

您还应该查看this

答案 3 :(得分:2)

只需创建对象,object.variablename;object.methodName();可用于制作非静态引用......不需要使用getter。

答案 4 :(得分:1)

myClass.getMyVarVal()速度较慢,因为它是一个方法调用,因此它会在堆栈上创建返回值等等。但是使用getter是更好的OOP练习。

答案 5 :(得分:1)

myLocalVar = myClass.getMyVarVal();

如果您使用OOP概念

,最好使用它

答案 6 :(得分:0)

Tomcat + Heroku + Maven项目:

如何引用Main类静态变量:

HEROKU_PRJ_FOLDER \ src \ main \ java \ servlet \ HelloServlet.java:

import launch.Main;
String my_str = Main.TEST_STRING;

HEROKU_PRJ_FOLDER \ src \ main \ java \ launch \ Main.java

package launch;
....other imports here....
public class Main {

    public static final String
    TEST_STRING = "[TEST_STRING]";

    public static void main(String[] args){
        ...somelogic...
    };
};

这可能适用于任何Tomcat项目, 但是我是使用Tomcat + Heroku + Maven做到的。发表答案,因为 我能找到的最接近的问题是这个,我已经知道 怎么做,只是确切的导入路径,我发现有点困惑 我的特殊问题。