gpt4 book ai didi

java - 在 super 构造函数中传递需要 `this` 的对象?

转载 作者:行者123 更新时间:2023-11-30 12:05:28 25 4
gpt4 key购买 nike

我正在设计一个类层次结构,我遇到了标题中的问题,这是它的一个较小的抽象:

public abstract class A {
private C c;

public A(C c) {
this.c = c;
}

// ...
}

public class B extends A {
private int a;
private int b;
// ...

public B(int a, int b, ... /* and more but no object of C */) {

super(new C(this)); // <-- this is the point, got error:
// can't access `this` .

this.a = a;
this.b = b;
// ...
}
}

public class C {
private A a;

public C(A a) {
this.a = a;
}
}

简而言之:A 需要保持对C 的引用,反之亦然,但是两者都应该在它们的构造函数中完成,并且在两者构造之后,字段A aC c 不应更改,因此我将它们设置为 private。那么在这种情况下,最佳做法是什么?

以下实际上不是一个很好的例子,但关键是我有一种情况需要做上面尝试做的事情。

(更多上下文:现在假设我将 class Aprivate C c; 更改为

private List<C> someCs;

即:AC 的容器,因此在某些情况下,需要对这些C 进行排序。对于每个 C 的一些客户端,客户端需要知道它的父级是什么,即它属于哪个 A。在这种情况下,我需要两个方向的引用。)

最佳答案

在构造函数完成之前,

this 不是其他对象的有效引用。出于这个原因,这种循环依赖(父引用子和子引用父)不能在构造函数中初始化。父子引用也不能是 final,因为 final 必须在构造函数中初始化。

你可以写一个工厂来初始化所有的 parent 和 child 。然后在所有初始化之后你可以交叉引用它们。但这需要工厂可以访问 child.parentparent.child 。他们要么是公开的,要么有一个公共(public)二传手。你可以做一些其他的特技来允许工厂在 parent 和 child 中设置一个私有(private)变量,但我不建议这样做。

这里有一个针对您的情况的建议:创建一个对象来跟踪 parent 和 child 之间的映射。映射有方法 getParent(this) 当它需要它的父时从子调用。以及方法 getChildren(this)getChildrenSorted(this) 在需要其子项时从父项调用。

映射可以初始化一次,然后使用 private 和 final 锁定,并防止在运行时进一步更改。每个 parent 和 child 都可以获得对该对象的私有(private)和最终引用。

更多信息:

关于java - 在 super 构造函数中传递需要 `this` 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56280748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com