首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问对象实例对象实例变量的正确方法是什么?

访问对象实例对象实例变量的正确方法是什么?
EN

Stack Overflow用户
提问于 2015-07-07 14:26:04
回答 5查看 58关注 0票数 1

假设我有两个构造函数类: Person和Arm。

代码语言:javascript
复制
public class Person
{
  private Arm arm; //instance variable

  public Person(Arm arm) //Constructor
  {
    this.arm = arm;
  }
}

-

代码语言:javascript
复制
public class Arm
{
  private int fingers; //instance variable

  public Arm(int fingers) //Constructor
  {
    this.fingers = fingers;
  }

  public int getFingers()
  {
    return this.fingers();
  }

}

每个Person对象都有一个Arm对象作为实例变量。每个Arm对象都有一个名为fingers的int实例变量。

访问fingers变量的正确方法是什么?

  1. 在Person类中创建另一个getFingers()方法:
代码语言:javascript
复制
//in Person.java
public int getFingers()
{
  return this.arm.getFingers(); //This is refrencing the getFingers() method in the Arm class
}

这样我就可以像这样访问它:

代码语言:javascript
复制
Arm myArm = new Arm(5);
Person me = new Person(myArm);

System.out.println(me.getFingers());
  1. 亲自创建一个返回arm的方法。 公共Arm getArm() {返回this.arm;}

因此,我可以使用来自getFingers类的Arm方法,如下所示:

代码语言:javascript
复制
Arm myArm = new Arm(5);
Person me = new Person(myArm);

System.out.println(me.getArm().getFingers())
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-07-07 14:38:06

通常情况下,我建议德米特定律在这里发挥作用。

  • 每个单位对其他单位的知识应当有限:只有与当前单位“密切”相关的单位。
  • 每个单位只应与其朋友交谈,不要与陌生人交谈。
  • 只和你的直属朋友谈谈。

如果我要写:

代码语言:javascript
复制
A a = new A();
D d = a.getB().getC().getD();

然后,这将允许您从A实例访问A,但它实际上破坏了封装,并显示出A具有BBC等等。您可能会争辩说,这在您的情况下是多余的,因为您希望Person具有Arm

另一种方法是考虑您真正希望顶层对象(Person)做什么,并告诉它为您做它。如果你想要手指,所以你可以告诉他们抓住一些东西(也许),那么:

代码语言:javascript
复制
person.pickUp(object)

这个人可以自己决定如何去做(它可以选择一只手臂,或者在极端的情况下它的脚或嘴!)你不是自己动手,而是让对象为你做点什么。这就是OOP的真正意义所在。

票数 2
EN

Stack Overflow用户

发布于 2015-07-07 14:31:49

对于这类问题,没有最佳做法。

这取决于您喜欢向Person类的用户公开或隐藏什么。如果您想隐藏Person包含一个Arm的信息,请向类Person添加一个公共方法getFingers()。如果在外部公开Arm类没有问题,那么向类Person添加一个方法getArm()

注意,公开Arm (如果Arm类中有一个方法setFinger() ),它可以从Person类的任何用户处使用。公开方法getFingers()阻止直接访问方法setFinger()的可能性

票数 0
EN

Stack Overflow用户

发布于 2015-07-07 14:35:03

选项1:person.getArmFingers(),如果您根本不想公开arm对象,并且希望通过Person对象进行所有交互,则非常有用。但是,请记住,添加到arm中的每个属性(如hasHair :)现在都需要通过Person包装,这从长远来看可能是不可取的。如果要使用此方法,请考虑将Arm对象包设置为私有。

选项2:使用person.getArm().getFingers()。这将公开Arm对象,但不需要通过Person访问每个arm属性。这可能是不可取的情况下,手臂本身没有意义,而不是一个人的一部分。

所以你的问题的答案是:这取决于

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31271382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档