Скрыть скрытый вывод WeakReferences или заставить клиента использовать их

Если я использую WeakReference, чтобы позволить слушателям не удерживаться на окружающем объекте. Должен ли мой клиент сталкиваться с API, применяя слабые ссылки, или это что-то, что я должен иметь внутренне и не подвергать этому усложнению? Также каково влияние тестирования. то есть я мог бы издеваться над слушателем, но если бы я "обновил" слабую ссылку внутри слушателя, я бы не смог протестировать поток, когда WeakRefernece станет нулевым.

WeakReference JavaDoc

Например:

interface TaskListener {
 void callback();
}

Не подвергайте WeakReference

class MyClass {
 private TaskListener;
 public void runTask() {
 taskListener = new TaskListener(){
 @Override
 public void callback() {
 }
 }
 task.setListener(taskListener);
 task.run();
 }
}

осущ:

class Task {
 public void setListener(TaskListener listener) {
 this.listener = new WeakReference<tasklistener>(listener); 
 }
}
</tasklistener>

Выделите WeakReference:

class MyClass {
 private WeakReference<tasklistener>;
 public void runTask() {
 taskListener = new WeakReference<tasklistener>(new TaskListener(){
 @Override
 public void callback() {
 }
 })
 task.setListener(taskListener);
 task.run();
 }
}
</tasklistener></tasklistener>

осущ:

class Task {
 public void setListener(WeakReference<tasklistener> listener) {
 this.listener = listener;
 }
}
</tasklistener>
1 ответ

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

Помните, что, несмотря на то, что с этим шаблоном существуют ограничения, я попробовал это раньше и обнаружил, что это на самом деле больше помех, чем помощь. Поскольку слабые ссылки выпадают, я не мог просто добавить слушателя, а затем забыть об этом - мне также нужно было сохранить ссылку на этого слушателя в другом месте, чтобы остановить его получение GC.

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

licensed under cc by-sa 3.0 with attribution.