有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有三节课。A类、B类和C类

我有一个类a,我想把a的同一个实例传递给类B和类C,当我删除类a(在C和B中使用的实例)时,我找到了一种方法,该类在C和B中通过引用设置为null,而不需要设置use setA(null)


共 (2) 个答案

  1. # 1 楼答案

    如果想控制实例的链接,需要一些管理机制。 如果没有第三方解决方案,最简单的方法就是提供中间容器对象,它将控制对实例的访问

    以下是一个基本示例:

    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
    

    另外,使用null也是一种不好的做法,所以最好使用Special Case模式来提供Null Object

  2. # 2 楼答案

    使用WeakReferences

    在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的实例是A的唯一一个非WeakReference的实例,那么A的该实例就有资格进行垃圾收集。垃圾回收后WeakReference将返回null