java从另一个类获取变量的正确方法
我可以用两种方式调用变量
一个就是这样做:
MyClass myClass = new MyClass();
myLocalVar = myClass.myVarVal;
另一种方法是使用这样的吸气剂:
myLocalVar = myClass.getMyVarVal();
这两种方法都很好,但我想知道最有效/最合适的方法是什么
谢谢
你可以在下面搜索框中键入要查询的问题!
我可以用两种方式调用变量
一个就是这样做:
MyClass myClass = new MyClass();
myLocalVar = myClass.myVarVal;
另一种方法是使用这样的吸气剂:
myLocalVar = myClass.getMyVarVal();
这两种方法都很好,但我想知道最有效/最合适的方法是什么
谢谢
# 1 楼答案
这两种技术都很糟糕,但使用getter是常见(而且更安全)的做法
要访问类的公共数据成员(也称为公共字段或公共属性),必须了解该类的实现细节(数据成员名称和数据成员类型)。这是一件坏事;它打破了面向对象的“信息隐藏”概念,增加了“耦合”
使用getter也是不好的(就像在糟糕的OOP实践中一样),因为对象不仅仅是数据的包装器;对象应该封装功能和数据。“将此值存储在此处,以便稍后获取”不是功能;这是一种鸣叫功能(比如笼子里的猴子鸣叫)。获得者是;但是,java中的一个公认的实践(以及C++和C语言等其他OOP Lite语言)。p>
为了不让你认为我是象牙塔里最纯洁的人,我当然会用吸气剂;我使用java,所以我使用getter
Getters可以很好地完成工作(没有双关语),只是不要到处相信“I R gud OOP Prgmr”,因为如果你使用Getters,你就不是一个“优秀的OOP程序员”,你只是一个完成工作的程序员
编辑:也许是更好的方法
更好的方法是不使用getter,而是设计类,使它们公开功能而不是数据。在实践中,有一点会出现问题;例如,如果需要在JSP页面上显示地址,可以在请求(或会话或blah)中放入一个带有地址的bean,并使用getter公开值。一种“更纯粹的面向对象编程”方法是放置一个bean,该bean公开了“在jsp上显示地址”功能
Edit2:也许是个更好的例子
假设我在美国的一家电话公司工作,我有一个代表客户电话号码的对象。这可能如下所示:
现在,假设我从网页上以
String inputPhoneNumber
的形式获取一个电话号码作为输入。为了便于讨论,接收此输入的类称为“servlet”我如何回答这个问题:“输入的电话号码是否在我的CustomerPhoneNumber对象列表中?”
选项1是公开并访问npa、nxx和serviceNumber数据成员。这太可怕了
选项2是为npa、nxx和服务编号提供getter,并将它们与输入进行比较。同样糟糕的是,暴露了太多的内部细节
选项3是提供一个getter,返回格式化的电话号码(我在上面调用了这个toString()。这更聪明,但仍然很糟糕,因为servlet必须知道getter将使用的格式,并确保输入的格式与getter相同
选项4(我称之为“Welcome to OOP”)提供了一个方法,该方法接受一个字符串,如果该字符串与客户服务号码匹配,则返回true。这样更好,可能看起来像这样(名称很长,但对于本例来说已经足够):
这是赢家,因为没有公开实现细节。toString还可以用于在JSP页面上输出电话号码
StringUtils是Apache Commons Lang的一部分
# 2 楼答案
如果你正在使用
OOP
概念,使用它会很好# 3 楼答案
myClass.getMyVarVal()
速度较慢,因为它是一个方法调用,因此它会在堆栈上为返回值等创建入口。但使用getter是更好的OOP实践