有没有办法让 Java 外部 Class 的实例调用其所有 Java 内部 Class 的实例?
Is there a way for an instance of a Java Outer Class to call all its instances of a Java Inner Class?
使用以下代码:
public class Outer {
final int foo;
public Outer(int foo) {
this.foo = foo;
}
public Inner createInnerInstance(int bar) {
return new Inner(bar);
}
public int getBarSum() {
// TODO: implement
}
public class Inner {
final int bar;
public Inner(int bar) {
this.bar = bar;
}
public int getBar() {
return bar;
}
public int getFooPlusBar() {
return foo + bar;
}
}
}
我想向 Outer
添加一个方法,它在每个 Inner
.
上调用一个方法
这样做的一种方法是 Outer
保留 List
个 Inner
个实例,getInnerInstance
附加到该实例。这个问题是我不希望列表引用内部实例以防止它们被垃圾收集。在 Java 中是否可以使用某种形式的弱链接列表?
有什么不同的方法吗?
注意:我只查找共享 Outer
特定实例的 Inner
。
如果外部 class 没有得到对内部 class 的引用,那么就没有(简单的)方法可以做到这一点。
在一个简单的层面上,考虑内部 classes 有另一个 this
引用,它引用外部 class(你可以通过内部的 Outer.this
访问它class)。
如果 class A 引用了 class B 的实例,但不是相反,找到引用 B 的特定实例的所有 A 实例的唯一方法是遍历 A 的所有实例并检查它们的 B 引用。而这已经从获取 A.
的 all 个实例的困难部分开始了
更简单的方法是跟踪创建的内部 classes,例如在 Outer
.
里面有一个 List<Inner>
示例:
class Outer {
List<Inner> inners = new LinkedList<>();
public Inner createInnerInstance(int bar) {
Inner inner = new Inner(bar);
inners.add( inner );
return inner;
}
}
如果可以再次删除 Inner
个实例,您将不得不处理它。当然,你可以使用更弱的引用,如 WeakReference
、SoftReference
等。如果你只是想获得 仍然存在 的内部实例(你必须检查参考)。但是,根据内部 classes 的大小,使用额外的引用实例可能不会导致更好的内存使用,因此请谨慎使用。
一组弱引用 (https://docs.oracle.com/javase/8/docs/api/java/lang/ref/WeakReference.html) 可能会解决您的问题。
也许你可以和 WeakReferences, for instance a WeakHashMap 一起工作。
使用以下代码:
public class Outer {
final int foo;
public Outer(int foo) {
this.foo = foo;
}
public Inner createInnerInstance(int bar) {
return new Inner(bar);
}
public int getBarSum() {
// TODO: implement
}
public class Inner {
final int bar;
public Inner(int bar) {
this.bar = bar;
}
public int getBar() {
return bar;
}
public int getFooPlusBar() {
return foo + bar;
}
}
}
我想向 Outer
添加一个方法,它在每个 Inner
.
这样做的一种方法是 Outer
保留 List
个 Inner
个实例,getInnerInstance
附加到该实例。这个问题是我不希望列表引用内部实例以防止它们被垃圾收集。在 Java 中是否可以使用某种形式的弱链接列表?
有什么不同的方法吗?
注意:我只查找共享 Outer
特定实例的 Inner
。
如果外部 class 没有得到对内部 class 的引用,那么就没有(简单的)方法可以做到这一点。
在一个简单的层面上,考虑内部 classes 有另一个 this
引用,它引用外部 class(你可以通过内部的 Outer.this
访问它class)。
如果 class A 引用了 class B 的实例,但不是相反,找到引用 B 的特定实例的所有 A 实例的唯一方法是遍历 A 的所有实例并检查它们的 B 引用。而这已经从获取 A.
的 all 个实例的困难部分开始了更简单的方法是跟踪创建的内部 classes,例如在 Outer
.
List<Inner>
示例:
class Outer {
List<Inner> inners = new LinkedList<>();
public Inner createInnerInstance(int bar) {
Inner inner = new Inner(bar);
inners.add( inner );
return inner;
}
}
如果可以再次删除 Inner
个实例,您将不得不处理它。当然,你可以使用更弱的引用,如 WeakReference
、SoftReference
等。如果你只是想获得 仍然存在 的内部实例(你必须检查参考)。但是,根据内部 classes 的大小,使用额外的引用实例可能不会导致更好的内存使用,因此请谨慎使用。
一组弱引用 (https://docs.oracle.com/javase/8/docs/api/java/lang/ref/WeakReference.html) 可能会解决您的问题。
也许你可以和 WeakReferences, for instance a WeakHashMap 一起工作。