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

时间:2015-07-07 14:26:05

标签: java object

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

<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
    <context-root>/GB</context-root>
</glassfish-web-app>

-

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

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

每个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的int实例变量。

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

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

fingers

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

//in Person.java
public int getFingers()
{
  return this.arm.getFingers(); //This is refrencing the getFingers() method in the Arm class
}
  1. 在Person中创建一个返回arm的方法。

    Arm myArm = new Arm(5);
    Person me = new Person(myArm);
    
    System.out.println(me.getFingers());
    
  2. 所以我可以使用public Arm getArm() { return this.arm; } 类中的getFingers方法,如下所示:

    Arm

5 个答案:

答案 0 :(得分:2)

通常我会建议Law of Demeter在这里发挥作用。

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

如果我要写:

A a = new A();
D d = a.getB().getC().getD();

然后,您可以从D 的实例访问A但是它会有效地破坏封装并显示A有{{1} }},B有一个B等等。您可能会认为这在您的情况下是多余的,因为您希望C拥有Person。< / p>

另一种方法是考虑您真正希望顶级对象(Arm)做什么,告诉它为您做。例如如果你想要手指,那么你可以告诉他们掌握一些东西(或许)然后:

Person

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

答案 1 :(得分:0)

这种问题没有最佳实践。

这取决于您希望向Person类的用户公开或隐藏的内容。 如果您想隐藏Person包含Arm的信息,请向Person类添加公共方法getFingers()。 如果在外部公开Arm课程时没有问题,请在课程getArm()中添加方法Person

请注意,如果Arm类中有方法setFinger(),则Arm可以向Person类的任何用户使用getFingers()。 公开方法setFinger()会阻止直接访问方法amInput[type=dropdown]

的可能性

答案 2 :(得分:0)

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

选项2 :使用person.getArm()。getFingers()。这将公开Arm对象,但不需要通过Person访问每个arm属性。如果Arm本身没有任何意义而不属于某个人,则这可能是不可取的。

所以问题的答案:取决于

答案 3 :(得分:0)

确实没有正确答案,因为它实际上取决于使用情况。

虽然,我的两分钱就是两个都做(你已经把它们都输了!)。我会将功能放在public static final String DEST = "results/fonts/math_symbols.pdf"; public static final String FONT = "resources/fonts/FreeSans.ttf"; public static final String TEXT = "this string contains special characters like this \u2208, \u2229, \u2211, \u222b, \u2206"; public void createPdf(String dest) throws IOException, DocumentException { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(dest)); document.open(); BaseFont bf = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Font f = new Font(bf, 12); Paragraph p = new Paragraph(TEXT, f); document.add(p); document.close(); } 类中,Arm类可以独立于Arm类使用。当然,在Person类中为其成员创建函数式包装器并没有什么坏处 - 特别是如果你想隐藏成员并且只允许Person类直接使用它。同样,它取决于使用情况。

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

答案 4 :(得分:0)

我的The Law of Demeter (LoD)解决了你的问题。这是 LoD Wikipedia 定义:

  

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

这些是遵循 LoD 的优点:

  

遵循Demeter法则的优点是所得到的软件更易于维护和适应。由于对象较少依赖于其他对象的内部结构,因此可以在不重新处理其调用者的情况下更改对象容器。

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

  

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

然而,据我所知坚持LoD通常被视为良好做法!所以,简而言之,请选择 Scenario 1