假设我有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
}
在Person中创建一个返回arm的方法。
Arm myArm = new Arm(5);
Person me = new Person(myArm);
System.out.println(me.getFingers());
所以我可以使用public Arm getArm()
{
return this.arm;
}
类中的getFingers方法,如下所示:
Arm
答案 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 !