java - 从设计的角度来看 "Leaking this"

标签 java constructor logic this

Warning: Leaking "this" in constructor

我一直遇到这个问题,我有一种挥之不去的感觉,因为我的设计是错误的或不是最优的。

我知道这个警告让我注意到我允许访问可能未完全初始化的对象这一事实。

假设我需要一个框架,它有一个列表(框架(列表列表))。在 List 中,我可能想做一些诸如 add() 之类的事情。为了确保 Frame 尽可能少地了解 List(只有它有一个),我想从 List 访问包含的 Frame(List HAS a Frame?)。这看起来有点傻,但我有 2 个以上的 List 实现,它们将以不同的方式使用 Frame ..

为确保正确使用我的代码,我需要在 List 的构造函数中使用一个 Frame。 我还需要在 Frame 的构造函数中有一个列表,因为它必须有一个:

public abstract class Frame {
    private final List list;

    public Frame(List list) {
        this.list = list;
        list.setFrame(this);
    }
}

public abstract class List {
    private Frame frame;

    protected final void setFrame(Frame frame) {
        this.frame = frame;
    }
}

那么,这是糟糕的设计,还是我真的应该创建一些中间脚手架来执行此操作,或者甚至将脚手架留给用户?

谢谢!

最佳答案

引入一个工厂方法:

public static Frame createFrame(List list) {
    Frame frame = new Frame(list);
    list.setFrame(frame);
}

private Frame(List list) {
    this.list = list;
}

这不会泄漏 this,并且始终确保一切都正确配置,而不需要每个调用者记住初始化关联的双方。

关于java - 从设计的角度来看 "Leaking this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8234695/

相关文章:

licensing - 我可以合法分发的最小 Java 运行时?

Java 字符串到字节。为什么值会改变?

java - 在静态 block Eclipse-java 中断言

Java readObject 和继承的转换

java - 使用 values( ) 创建枚举常量的最终 Java 类数组

C 使用按位运算符判断二进制数是否将所有偶数设置为 0

ios - 图表的动态 y 轴

java - Eclipse - 打开新的浏览器选项卡?

dart - Dart const类参数检查

arduino - 评估一个值是增加还是减少(arduino)