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

Java 访问对象实例变量的正确方法是什么,java,object,Java,Object,假设我有两个构造函数类;人和手臂 public class Person { private Arm arm; //instance variable public Person(Arm arm) //Constructor { this.arm = arm; } } - 每个Person对象都有一个Arm对象作为实例变量。 每个Arm对象都有一个名为fingers的int实例变量 访问fingers变量的正确方法是什么 一,。 在Person类中创建另一个getFi

假设我有两个构造函数类;人和手臂

public class Person
{
  private Arm arm; //instance variable

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

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

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

一,。 在Person类中创建另一个getFingers()方法:

//in Person.java
public int getFingers()
{
  return this.arm.getFingers(); //This is refrencing the getFingers() method in the Arm class
}
所以我可以这样访问它:

Arm myArm = new Arm(5);
Person me = new Person(myArm);

System.out.println(me.getFingers());
Arm myArm = new Arm(5);
Person me = new Person(myArm);

System.out.println(me.getArm().getFingers())
  • 亲自创建一个返回arm的方法

    public Arm getArm()
    {
      return this.arm;
    }
    
  • 因此,我可以使用
    Arm
    类中的getFingers方法,如下所示:

    Arm myArm = new Arm(5);
    Person me = new Person(myArm);
    
    System.out.println(me.getFingers());
    
    Arm myArm = new Arm(5);
    Person me = new Person(myArm);
    
    System.out.println(me.getArm().getFingers())
    

    对于这类问题没有最佳实践

    这取决于您希望向Person类的用户公开或隐藏什么。 如果要隐藏Person包含Arm的信息,请向类Person添加公共方法
    getFingers()
    。 如果将
    Arm
    类暴露在外部没有问题,则将方法
    getArm()
    添加到类
    Person

    请注意,如果
    Arm
    类中有方法
    setFinger()
    ,则
    Person
    类的任何用户都可以使用该方法。
    公开方法
    getFingers()
    阻止直接访问方法
    setFingers()

    选项1:person.getArmFingers(),如果您根本不想公开手臂对象,并且希望所有交互都通过person对象进行,则此选项非常有用。但是,请记住,您添加到arm的每个属性(如hasHair:)现在都需要通过Person进行包装,从长远来看,这可能是不可取的。如果你想使用这个,考虑ARM对象包私有< /P> 选项2:使用person.getArm().getFingers()。这将公开Arm对象,但不需要通过Person访问每个Arm属性。如果手臂本身没有意义而不是人的一部分,那么这可能是不可取的


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

    通常我会建议在这里发挥作用

    • 每个单元对其他单元的了解应有限:仅与当前单元“密切”相关的单元
    • 每个单位只能和朋友交谈;不要和陌生人说话
    • 只和你的直系朋友交谈
    如果我要写:

    A a = new A();
    D d = a.getB().getC().getD();
    
    然后,这将允许您从
    A
    的实例访问
    D
    ,但它有效地破坏了封装,并显示
    A
    B
    B
    C
    等。您可能会认为这在您的情况下是多余的,因为你希望一个
    有一个
    手臂

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


    这个人可以自己决定怎么做(在极端情况下,它可以选择手臂、脚或嘴!)。你告诉对象为你做点什么,而不是自己拿手指。这正是OOP的真正含义。

    确实没有正确的答案,因为这取决于使用情况

    不过,我的两分钱可以同时完成这两项工作(反正你已经把它们都打出来了!)。我将把功能放在
    Arm
    类中,这样
    Arm
    类就可以独立于
    Person
    类使用。当然,在
    Person
    类中为其成员的功能创建包装也没有什么坏处,特别是如果您希望隐藏成员,并且只允许直接使用
    Person
    类。同样,它取决于使用情况


    只是一个建议。祝你好运。

    你的问题在我的演讲中得到了很好的解决。这是维基百科对LoD的定义:

    每个单元对其他单元的了解应有限:仅与当前单元“密切”相关的单元。 每个单位只能和朋友交谈;不要和陌生人说话。 只和你的直系朋友交谈

    以下是遵循LoD的优点:

    遵循德米特定律的优点是,生成的软件更易于维护和适应。由于对象较少依赖于其他对象的内部结构,因此可以更改对象容器,而无需重新处理其调用者

    还有一些缺点,在特定情况下可能足以忽略LoD:

    虽然LoD增加了软件系统的适应性,但它也可能导致必须编写许多包装器方法来将调用传播到组件;在某些情况下,这会增加明显的时间和空间开销


    然而,据我所知,坚持LoD通常被视为良好实践!因此,长话短说,请使用场景1

    这段代码不编译
    Private
    Public
    加大写字母“P”不是合适的Java关键字。通常我会说#2,但这实际上取决于你在做什么,你愿意公开什么,等等。。另外,您的呼叫将是
    me.getArm().getFingers()
    ,而不是
    me.myArm.getFingers()
    @sstan是的,抱歉修复:)@RedRoboHood我很抱歉,但是我找不到代码中任何访问标志的大写字母“P”?@JackPettersson当然没有。你在我发布我的评论后修复了它们。这是有道理的,尽管它会用大量的方法(如果我要为它们创建更多的实例对象和方法)使Person对象变得混乱,嗯。。。我想这取决于剩下的代码。谢谢你的意见!我认为这取决于该对象的责任,以及您将这些责任细化到何种程度