我可以通过两种方式调用变量。
一个就是这样做:
MyClass myClass = new MyClass();
myLocalVar = myClass.myVarVal;
另一种方法是使用这样的吸气剂:
myLocalVar = myClass.getMyVarVal();
两种方式都运行良好,但我想知道最有效/最合适的方法是什么?
由于
答案 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)
答案 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做到的。发表答案,因为 我能找到的最接近的问题是这个,我已经知道 怎么做,只是确切的导入路径,我发现有点困惑 我的特殊问题。