在java中删除对象之前检查某个对象是否被使用

时间:2016-09-19 05:22:48

标签: java object

我有一种情况,当有人试图从b删除一个对象bList时,我需要给出一条错误消息,并且在其他一些类中使用它,比如说A
如果b未在另一个类中引用,那么我不应该抛出错误消息。

上述场景的伪代码

public class A {

    B b;

    void setB(B b) {
        this.b = b;
    }
}

public class NotifyTest {

    List<B> bList = new ArrayList<>();

    String notifyTest() {

        A a = new A();
        B b = new B();
        a.setB(b);
        bList.add(b);

        if (b referencedSomewhere)   
        {
            return "error";
        }
        else
        {
             bList.remove(b);
             return  "success";
        }
    }
}

遍历我的整个模型以检查对象b是否在某个地方被使用是一个性能损失,因此我不想采用这种方法。
如果Java提供的这种情况有任何解决方案或建议更好的方法来解决这个问题,请告诉我。

Edit1:在除bList以外的任何其他地方引用b时,我需要一条错误消息

3 个答案:

答案 0 :(得分:1)

如果您的目的是自动释放列表中不再引用的项目,可以使用https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html

您还可以使用它来跟踪尚未收集垃圾的所有密钥。这可以为您提供有关哪些项目已被垃圾回收(无法访问后)的信息。但是,由于垃圾收集器可能在任意时间运行,因此信息不会是实时的。

答案 1 :(得分:1)

我认为以下内容适合您。这很快就会结合在一起向您展示这个想法。它尚未经过测试,如果您希望它是线程安全的,则需要更多工作。

WEEKDAY(DATE(YEAR(TODAY()), 1, 3))

使用对象时,将其添加到RefCounter。

class RefCounter<T>
{
   private HashMap<T, Integer>  counts = new HashMap<>();

   public T  using(T object)
   {
      Integer  num = counts.get(object);
      if (num == null)
         counts.put(object, 1);
      else
         counts.put(object, num+1);
      return object;
   }

   public T  release(T object)
   {
      Integer  num = counts.get(object);
      if (num == null)
         throw new IllegalArgumentException("Object not in RefCounter");
      else if (num == 1)
         counts.remove(object);
      else
         counts.put(object, num-1);
      return object;
   }


   public boolean  usedElsewhere(T object)
   {
      Integer  num = counts.get(object);
      return (num != null && num > 1);
   }

}

完成该对象后

refCounter.using(x);
someList.add(x);

测试对象是否在其他地方使用

someList.remove(index);
refCounter.release(x);

请记住,每次保留或释放对象时,您都需要确保调用if (refCounter.usedElsewhere(x) { return "error"; } else { someList.remove(index); refCounter.release(x); } using(),否则这一切都毫无意义。

答案 2 :(得分:0)

如果绝对没有使用该对象(或者剩下的内存不多),则java会将其标记为已删除,然后当您开始耗尽内存时,java会自动为您执行垃圾回收。

大多数高级别都有垃圾收集(GC),如java,C#,Python(iirc)等。如果你使用更多低级语言,比如C ir C ++,你只需要注意内存(这是实际上介于低位和高位之间)