我有一种情况,当有人试图从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
时,我需要一条错误消息
答案 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 ++,你只需要注意内存(这是实际上介于低位和高位之间)