Java запоминание ссылки - PullRequest
       3

Java запоминание ссылки

0 голосов
/ 26 октября 2018

Я создаю объект с помощью метода. Тогда я хочу «уничтожить» это. Мне нужно как-то запомнить ссылку на указанный объект для вызова destroy() на нем? Как мне это сделать?

public class Obj {
     private int size;
     private boolean exist;

     private Obj(int size) {
          this.size = size;
          this.exist = true;
     }

     public static Obj getObj(int size) {
          Obj s = new Obj(size);
          return s;
     }

     public void destroy() {
          exist = false;
     }
}

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Итак, ваш метод создает ресурс, над ним работает какая-то другая сущность, а затем вы освобождаете ресурс.У меня тепло?

В этом случае чистый подход - передать код, который работает с объектом, как функциональный объект, чтобы вы могли определенно очистить его при выходе.Общая идея называется Execute Around.

 import java.util.function.Consumer;

 public static void getObj(int size, Consumer<Obj> consumer) {
      Obj s = new Obj(size);
      try {
          consumer.accept(s);
      } finally {
          s.destroy();
      }
 }

Использовать как:

Obj.getObj(1066, s -> {
    ... something with s ...;
});

В качестве альтернативы есть java.lang.AutoCloseable и try-with-resource, который возлагает ответственность на вызывающего, так что это лучше всегопо возможности избегать.

В любом случае, попытка объединить изменяемые файлы в статические данные, как правило, очень плохая идея.

0 голосов
/ 26 октября 2018

Сборщик мусора должен сделать это за вас ... однако, если вы хотите неявно вызвать destroy, вы можете определить список всех классов на уровне класса

public class Obj {
     private int size;
     private boolean exist;
     private static List<Obj> list = new ArrayList<>();


     private Obj(int size) {
          this.size = size;
          this.exist = true;
     }

     public static Obj getObj(int size) {
          Obj s = new Obj(size);
          list.add(s) // save ref
          return s;

     }

     public void destroy() {
          exist = false;
     }
}
0 голосов
/ 26 октября 2018

Другие ответы, кажется, пытаются рассказать вам о сборке мусора.

Но чтобы ответить на ваш фактический вопрос ... В вашем коде вам нужно будет вызвать фабричный метод и присвоить результатпеременная: Obj obj = Obj.getObj(1234).Это ваша ссылка на объект.Когда вы хотите вызвать метод destroy(), вы используете эту ссылку.

Например:

public class Main {

    public static void main(String[] args) {
        Obj obj = Obj.getObj(42);
        obj.destroy();
    }
}
0 голосов
/ 26 октября 2018

Если вы хотите запомнить ссылку на переменную в классе, вы можете объявить ее на уровне класса и использовать ее для инициализации и уничтожения методов

class Obj {
   private static Obj s; 
   public static int getObj(){
        s=new Obj();
   }
   public void destroy (){
        s=null;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...