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())
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对象变得混乱,嗯。。。我想这取决于剩下的代码。谢谢你的意见!我认为这取决于该对象的责任,以及您将这些责任细化到何种程度