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

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

一个就是像这样做:

MyClass myClass = new MyClass(); myLocalVar = myClass.myVarVal; 

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

 myLocalVar = myClass.getMyVarVal(); 

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

谢谢

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

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

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

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

吸气剂可以完成工作(没有双关语),只是不要相信“IR gud OOP Prgmr”,因为如果你使用吸气剂你不是一个“好的oop程序员”,你只是一个程序员得到的完成工作。

编辑:也许是一种更好的方式。

更好的方法是不使用getter,而是设计类,以便它们暴露function而不是数据。 在实践中,有一个地方会崩溃; 例如,如果需要在JSP页面上显示地址,则将bean放在请求(或会话或blah)中,并使用地址并使用getter公开值。 “更纯粹的纯粹”方式是将暴露的“bean显示在jsp上的地址”function。

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

为了封装,你应该总是选择第二种方法。

 myLocalVar = myClass.getMyVarVal(); 

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

总是使用getter和setter来访问你的属性!

你也应该看看这个 。

只需创建object和object.variablename;object.methodName(); 可用于制作非静态参考……不需要使用吸气剂。

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

 myLocalVar = myClass.getMyVarVal(); 

如果您正在使用OOP概念,那么使用它会很好

Tomcat + Heroku + Maven项目:

如何引用Main类静态变量:

HEROKU_PRJ_FOLDER的\ src \主\ java的\ servlet的\ HelloServlet.java:

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

HEROKU_PRJ_FOLDER的\ src \主\ java的\启动\ 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完成了这项工作。 发表答案,因为我能找到的最接近的问题就是这个,我已经知道该怎么做,只是确切的导入路径,我发现我的特定问题有点混乱。