Несколько факторов способствуют получению надежного решения в Java, в отличие от C ++.
Следующий пример ненадежен, хотя он может предоставить вам достаточно правильный ответ, если вы используете метод hasAtleastOne ().
class Example {
private static int noOfInstances = 0;
public Example() {
noOfInstances++;
}
public static boolean hasAtleastOne() {
if(noOfInstances > 0)
return true;
else
return false;
}
protected void finalize() throws Throwable {
noOfInstances--;
}
}
Ненадежность проистекает из того факта, что деструкторы не доступны в Java, в отличие от C ++. Сборщик мусора должен освободить память, потребляемую экземпляром - экземпляр все еще может находиться в памяти как сирота, поскольку никакой другой объект не ссылается на него. Следовательно, вы никогда не знаете, на какой объект больше не ссылаются.
По общему признанию, это теоретически отличается от отсутствия в памяти вообще, но вам придется подождать, пока будет вызван метод finalize (), прежде чем вы точно будете знать, что такой экземпляр класса недоступен. Финализаторы приходят с предупреждением - на них нельзя полагаться в критических по времени приложениях, поскольку между потерянным объектом и финализацией может быть коэффициент от нескольких секунд до минут; Короче говоря, нет никакой гарантии, что они могли быть вызваны.
Шаблон утилизации
Вы можете повысить надежность решения, внедрив шаблон Dispose . Это также требует, чтобы клиент класса вызвал метод dispose, чтобы сигнализировать о том, что экземпляр должен быть удален, так что количество экземпляров может быть уменьшено. Плохо написанные клиенты сделают решение ненадежным.