有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我可以用两种方式调用变量

一个就是这样做:

MyClass myClass = new MyClass();    

myLocalVar = myClass.myVarVal;

另一种方法是使用这样的吸气剂:

myLocalVar = myClass.getMyVarVal();

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

谢谢


共 (3) 个答案

  1. # 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:也许是个更好的例子

    假设我在美国的一家电话公司工作,我有一个代表客户电话号码的对象。这可能如下所示:

    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将使用的格式,并确保输入的格式与getter相同

    选项4(我称之为“Welcome to 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的一部分

  2. # 2 楼答案

    myLocalVar = myClass.getMyVarVal();
    

    如果你正在使用OOP概念,使用它会很好

  3. # 3 楼答案

    myClass.getMyVarVal()速度较慢,因为它是一个方法调用,因此它会在堆栈上为返回值等创建入口。但使用getter是更好的OOP实践