Java: в поисках изменяемой / повторно ссылочной реализации слабых ссылок - PullRequest
5 голосов
/ 14 февраля 2011

Я ищу реализацию со слабой ссылкой, похожую на java.lang.ref.WeakReference, но которая предлагает метод set() или какой-либо другой способ повторной ссылки на созданный объект со слабой ссылкой. Вот пример:

MutableWeakReference ref = new MutableWeakReference(someObject);
ref.set(anotherObject);

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

Я пытался скопировать код из JDK, но это кажется невозможным, поскольку java.lang.ref.Reference использует внутренний класс sun.misc.Cleaner. Я также посмотрел на реализацию Android, но, похоже, это зависит от Dalvik VM для сборки мусора. Интересно, возможно ли это реализовать без изменения JVM / среды.

Ответы [ 3 ]

3 голосов
/ 14 февраля 2011

Я на самом деле реализую какой-то итератор.Всякий раз, когда я перехожу к следующей записи, мне нужно создать новый WeakReference.

. Я озадачен, почему вам нужно вообще использовать WeakReference в итераторе.Обычный вариант использования для WeakReference предназначен для долгосрочных ссылок на объекты.Но итератор обычно является краткосрочным объектом, а итерация обычно является краткосрочным процессом.Тот факт, что он / она использует обычную (сильную) ссылку на целевой объект в краткосрочной перспективе, не должен вызывать беспокойства.

Я провел несколько тестов, и кажется, что это похоже на 8-В 10 раз медленнее.

Опять же, это говорит о том, что вам вообще не следует использовать WeakReference.

Есть ли конкретная причина, по которой не работает обычный справочникдля тебя?

3 голосов
/ 14 февраля 2011

Разве нельзя просто заключить ваши ссылки в простой

class MyOwnReference<T> {
    public T ref;
    public void set(T o) { ref = o; }
}

и создайте WeakReference<MyOwnReference<WhatEver>>?

Интересно, возможно ли это реализовать без изменения JVM / среды.

Нет, вы, вероятно, не можете "переопределить" WeakReference. Это класс, поддерживаемый JVM.

Вы уверены, что создание экземпляров WeakReference замедляет его? Я не думаю, что делать

ref = new WeakReference(someObject);

вместо некоторых

ref.set(anotherObject);

будет намного дороже.

0 голосов
/ 14 февраля 2011

Вы не можете самостоятельно запрограммировать слабую ссылку.Это «специальный» класс, который JVM обрабатывает специально.

Просто используйте новую слабую ссылку

class MutableWeakReference<T> 

    WeakReference<T> wr;

    void set(T obj)
        wr = new WeakReference(obj);  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...