java - Java 中的组合

标签 java lazy-loading composition

假设我有以下类(class):

public class BodyClass{

private LegClass myLeftLeg;
private LegClass myRightLeg;
private NoseClass myNose;

...

}

稍后在软件程序深处的某个地方,我将有一个 myRightLeg 的单独实例。

现在,为什么我不容易(或根本不知道)这个右腿属于哪个 BodyClass 对象,更不用说这个实例变量包含在哪个类中了?为什么在组合关系中,运行时父类的信息不会自动存储在子对象中?

难道 Java 不能延迟加载每个类变量以及有关父类本身的信息吗?

为什么这会很糟糕?这难道不是一个相当可观的好处吗?

我听到人们说子类不应该知道有关其父类(super class)的任何信息,实例变量不应该知道有关其父类的任何信息,但坦率地说,我不明白为什么不这样做。

我的问题与这个问题相关:

How do you find all subclasses of a given class in Java?

最佳答案

Now, how come I won't know easily (or at all) which BodyClass object this rightleg pertains to, let alone which Class this instance variable is contained in?
...
Why is it that in composition relationships, the information about the parent class is not automatically stored in the child objects, at runtime?

因为the language specification不包括此要求。

在 Java 中,对象不包含对其他对象的引用,除非将它们作为字段显式指定,或作为继承字段隐式指定。就是这样。如果您希望您的对象知道哪些对象了解它们,您必须自己编程:

class LegClass {
    private BodyClass body;

    void setBody(BodyClass body) {
        this.body = body;
    }
}

class BodyClass {
    // snip...
    void setRightLeg(LegClass rightLeg) {
        this.myRightLeg = rightLeg;
        rightLeg.setBody(this);
    }
}

注意 tight coupling这介绍了两个类之间的情况。 Tight coupling is generally not a good thing.

我不明白为什么这特别有用,而且这样的“功能”会违反 OOP(Java 拥护的)的一些原则,例如 EncapsulationSingle Responsibility 。知道哪个实例(记住,没有理由它必须只有一个!)引用它的字段通常是一种代码味道。

关于java - Java 中的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18940444/

相关文章:

java - 如何使代码循环并在代码末尾指定 boolean 值?

javascript - ES6 类的 Mixins,用 babel 转译

javascript - 覆盖 React 组件方法

inheritance - 通过组合模拟字段继承

java - main() 打印多维数组的值与 Paint() 不同

java - 如何在cmd中使用jar编译执行java?

c# - 插入新实例时不执行 Entity Framework 核心延迟加载

ios - SDWebImage:在刷新和放置图像之前运行方法

c# - Equals 和 GetHashCode 中延迟加载的 NHibernate 属性

Java-ee 上下文查找总是失败