gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:39:06 24 4
gpt4 key购买 nike

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

一个就是这样:

MyClass myClass = new MyClass();    

myLocalVar = myClass.myVarVal;

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

myLocalVar = myClass.getMyVarVal();

这两种方法都很好,但我想知道最有效/最正确的方法是什么?

谢谢

最佳答案

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

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

使用 getter 也是不好的(因为在糟糕的 OOP 实践中),因为对象不仅仅是数据的包装器;对象应该封装功能和数据。 “将此值存储在此处以便稍后获取”不是功能;它是叫声功能(就像笼子里的猴子叫声)。 setter/getter 是;然而,这是 java(以及其他 OOP-lite 语言,如 c++ 和 c#)中公认的做法。

免得你们觉得我是象牙塔里最纯的,我当然用getters;我用java,所以我用getters。

getter 可以很好地完成工作(没有双关语),只是不要四处走动相信“I R gud OOP Prgmr”,因为如果你使用 getter,你就不是一个“好的 oop 程序员”,你只是一个完成工作的程序员。

编辑:也许是更好的方法。

更好的方法是不使用 getter,而是设计您的类,以便它们公开功能而不是数据。在实践中,有一点会崩溃;例如,如果您需要在 JSP 页面上显示一个地址,您可以将一个 bean 放入带有地址的请求(或 session 或 blah)中,并使用 getter 公开这些值。一种“更纯 oop”的方法是放置一个暴露“在 jsp 上显示地址”功能的 bean。

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”)提供了一个方法,该方法接受一个字符串并在与客户服务号码匹配时返回 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 的一部分.

关于java - 从另一个类获取变量的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9212861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com