我有3节课。 A类,B类和C类。
我有一个A类,我想将A的同一个实例传递给B类和C类,当我删除在C和B中设置为null的A类(在C和B中使用的实例)时,我发现了一种方法通过引用而无需设置使用setA(null)。
答案 0 :(得分:1)
使用WeakReference s。
在B和C中,像这样引用A:
public class B {
private final WeakReference<A> myA;
public B (A aToUse) {
myA = new WeakReference<A>(aToUse);
}
private void doSomethingWithMyA() {
A aToUse = myA.get(); // This returns null when the instance has been GC'd
}
}
现在,如果您要删除的A实例是唯一不是WeakReference
的A实例,那么该A实例就有资格进行垃圾回收。收集垃圾后,WeakReference
将返回null
;
答案 1 :(得分:0)
不,如果我没有错,你想要在删除A类之后你想要那个,Class Band C应该运行为所用A的实例分配null, 你不能这样做,基本上当你使用一个类说另一个类中的A类说B类,A类的类加载器,如果找到它然后JVM继续执行另一个步骤,但是如果你删除了那个类,类加载器将无法找到它,并将抛出异常,类未找到异常,或类似的东西,
答案 2 :(得分:0)
根据我的理解,如果你将A类的实例传递给B和C,你想在删除它之后将其引用设置为null。
请注意,首先所有类都由类加载器加载,因此在编译时会检查引用,如果删除了类A,并且肯定已经在B和C中声明了A的引用,那么它会为您提供编译错误类型缺少类似的东西
答案 3 :(得分:0)
如果要控制指向实例的链接,则需要一些管理机制。 如果没有第三方解决方案,最简单的方法就是提供中间容器对象,它将控制对您实例的访问。
这是一个基本的例子:
public static void main (String[] args) {
DogContainer dc = new DogContainer(new Dog("Scooby-Doo"));
Person shaggy = new Person("Shaggy");
shaggy.setDogContainer(dc);
Person dafna = new Person("Dafna");
dafna.setDogContainer(dc);
System.out.println(shaggy.getName() + " -> " + shaggy.getDogName());
System.out.println(dafna.getName() + " -> " + dafna.getDogName());
// Something happened with Scooby here. Say, a bus factor.
dc.setDog(null);
System.out.println(shaggy.getName() + " -> " + shaggy.getDogName());
System.out.println(dafna.getName() + " -> " + dafna.getDogName());
}
static class Dog {
private String name;
public Dog(String name) { this.name = name; }
public String getName() { return name; }
}
static class DogContainer {
private Dog dog;
public DogContainer(Dog dog) { this.dog = dog; }
public Dog getDog() { return dog; }
public void setDog(Dog dog) { this.dog = dog; }
}
static class Person {
private String name;
private DogContainer dogContainer;
public Person(String name) { this.name = name; }
public String getName() { return name; }
public void setDogContainer(DogContainer dc) { this.dogContainer = dc; }
public String getDogName() {
Dog dog = dogContainer.getDog();
return dog == null ? "Sorry, this person is not a dog owner" : dog.getName();
}
}
这里我们有三个实体:狗,人和狗容器。 这个人是狗主人。但他没有与狗直接联系。它只能通过容器与狗互动。 因此,如果您将链接更改为容器,则会影响所有人。
输出结果为:
Shaggy -> Scooby-Doo
Dafna -> Scooby-Doo
Shaggy -> Sorry, this person is not a dog owner
Dafna -> Sorry, this person is not a dog owner
P.S。使用null也是一种不好的做法,因此最好使用Special Case
模式来提供Null Object
。