使用引用删除其他类中的A类和所有相关实例

时间:2014-02-02 07:48:17

标签: java reference

我有3节课。 A类,B类和C类。

我有一个A类,我想将A的同一个实例传递给B类和C类,当我删除在C和B中设置为null的A类(在C和B中使用的实例)时,我发现了一种方法通过引用而无需设置使用setA(null)。

4 个答案:

答案 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