[英]Proper way of getting variable from another class
我可以用2种方式调用变量。
一个就是这样做:
MyClass myClass = new MyClass();
myLocalVar = myClass.myVarVal;
另一种方法是使用这样的getter:
myLocalVar = myClass.getMyVarVal();
两种方式都运行良好,但我想知道最有效/最合适的方法是什么?
谢谢
这两种技术都很糟糕,但使用吸气剂是常见的(也是更安全的)做法。
要访问类的公共数据成员(也称为公共字段或公共属性),您必须知道类的实现详细信息(数据成员名称和数据成员类型)。 这是件坏事; 它打破了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)
}
}
现在说我从网页中输入一个电话号码作为输入,格式为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的一部分。
总是使用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完成了这项工作。 发表答案,因为我能找到的最接近的问题就是这个,我已经知道该怎么做,只是确切的导入路径,我发现我的特定问题有点混乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.