Как я могу узнать, существует ли экземпляр класса в памяти? - PullRequest
3 голосов
/ 18 сентября 2009

Как я могу узнать, существует ли экземпляр класса в памяти?


Моя проблема в том, что не нужно читать метод, если существует экземпляр класса это мой код

private void jButton (java.awt.event.ActionEvent evt) {
    PNLSpcMaster pnlSpc = new PNLSpcMaster();
    jtabbedPanel.addTab("reg",pnlSpc);
}

Я хочу проверить экземпляр PNLSpcMaster, конечно, я могу проверить статическим логическим значением, но я думаю, что этот способ лучше.

Ответы [ 5 ]

7 голосов
/ 18 сентября 2009

Если вы хотите иметь только один экземпляр «PNLSpcMaster», тогда вам нужен одиночный :

Это обычная идиома синглтона:

public class PNLSpcMaster {

   /**
    * This class attribute will be the only "instance" of this class
    * It is private so none can reach it directly. 
    * And is "static" so it does not need "instances" 
    */        
   private static PNLSpcMaster instance;

   /** 
     * Constructor make private, to enforce the non-instantiation of the 
     * class. So an invocation to: new PNLSpcMaster() outside of this class
     * won't be allowed.
     */
   private PNLSpcMaster(){} // avoid instantiation.

   /**
    * This class method returns the "only" instance available for this class
    * If the instance is still null, it gets instantiated. 
    * Being a class method you can call it from anywhere and it will 
    * always return the same instance.
    */
   public static PNLSpcMaster getInstance() {
        if( instance == null ) {
            instance = new PNLSpcMaster();
        }
         return instance;
   }
   ....
 }

Использование:

private void jButton (java.awt.event.ActionEvent evt) {
    // You'll get the "only" instance.        
    PNLSpcMaster pnlSpc = PNLSpcMaster.getInstace(); //<-- getInstance()
    jtabbedPanel.addTab("reg",pnlSpc);
}

Или напрямую:

private void jButton (java.awt.event.ActionEvent evt) {
    jtabbedPanel.addTab("reg",PNLSpcMaster.getInstace());
}

Для базового использования Singleton Pattern работает очень хорошо. Однако для более изощренного использования это может быть опасно.

Вы можете прочитать об этом подробнее: Почему синглтоны противоречивы

1 голос
/ 18 сентября 2009

Я думаю, что вы используете шаблон singleton .

0 голосов
/ 18 сентября 2009

Для классов, имеющих понятие идентичности, применяется шаблон Карта идентичности .

0 голосов
/ 18 сентября 2009

Несколько факторов способствуют получению надежного решения в 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, чтобы сигнализировать о том, что экземпляр должен быть удален, так что количество экземпляров может быть уменьшено. Плохо написанные клиенты сделают решение ненадежным.

0 голосов
/ 18 сентября 2009

Нет разумного способа узнать, существует ли экземпляр определенного класса.

Если вам нужно знать эту информацию, создайте статическое логическое поле и установите его из конструктора:

class MyClass {
    private static bool instanceExists = false;
    public MyClass() {
        MyClass.instanceExists = true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...