Linter против WeakReference
От: pva  
Дата: 24.10.23 07:58
Оценка:
Привет,

в общем, использую в некоторых поделках механизм уведомления по подписке
    final private LinkedList<WeakReference<IDataReadyNotify>> listeners = new LinkedList<>();
    ...
    @Override
    public IDataChunk subscribe(IDataReadyNotify listener) {
        listeners.add(new WeakReference<>(listener));
        return this;
    }

    protected synchronized void notifyDataReady(IDataChunk chunk) {
        for (WeakReference<IDataReadyNotify> listener: listeners) {
            IDataReadyNotify item = listener.get();
            if (item != null) item.onDataReady(chunk);
        }
    }


соответственно, для
    private final IDataChunk.IDataReadyNotify onReadyNotifier = XXDataCollector.this::notifyDataReady;


линтер советует заменить локальной переменной, что очевидно не подходит поскольку нарушает время жизни объекта.
Не могу найти подходящую аннотацию, чтобы задавить.
newbie
Re: Linter против WeakReference
От: GarryIV  
Дата: 24.10.23 21:32
Оценка: +1
Здравствуйте, pva, Вы писали:

pva>линтер советует заменить локальной переменной

у линтеров обычно есть способ задавить конкретное срабатывание правила. имя линтера и его ругательство в студию. обычно легко гуглится если не экзотика.
вот например про чекстайл https://stackoverflow.com/questions/4023185/disable-a-particular-checkstyle-rule-for-a-particular-line-of-code
WBR, Igor Evgrafov
Re: Linter против WeakReference
От: r0nd  
Дата: 24.10.23 22:48
Оценка: +1
Здравствуйте, pva, Вы писали:

pva>Не могу найти подходящую аннотацию, чтобы задавить.


Попробуйте @SuppressWarnings("UnusedAssignment").
@SuppressWarnings("UnusedAssignment")
private final IDataChunk.IDataReadyNotify onReadyNotifier = XXDataCollector.this::notifyDataReady;
...<< Dementor 1.5.0 ✪ Lets Play a Game ⚀⚁⚂⚂⚄>>
Re[2]: Linter против WeakReference
От: pva  
Дата: 25.10.23 06:25
Оценка:
Здравствуйте, GarryIV, Вы писали:

pva>>линтер советует заменить локальной переменной

GIV>у линтеров обычно есть способ задавить конкретное срабатывание правила. имя линтера и его ругательство в студию. обычно легко гуглится если не экзотика.
GIV>вот например про чекстайл https://stackoverflow.com/questions/4023185/disable-a-particular-checkstyle-rule-for-a-particular-line-of-code
Стандартный линтер из АндроидСтудио. Что-то я про гугление не подумал. Решением оказалось @SuppressWarnings("FieldCanBeLocal")
newbie
Re[3]: Linter против WeakReference
От: · Великобритания  
Дата: 25.10.23 09:09
Оценка:
Здравствуйте, pva, Вы писали:

pva>listeners.add(new WeakReference<>(listener));

Я надеюсь, это неполный код. Иначе у тебя тут утечка ресурсов — в список что-то добавляется, но никогда не удаляется.

pva>Стандартный линтер из АндроидСтудио. Что-то я про гугление не подумал. Решением оказалось @SuppressWarnings("FieldCanBeLocal")

Эээ.. Так ведь там есть intention чтобы suppress warning. Оно само поставит нужную аннотацию в нужное место.
https://www.jetbrains.com/help/idea/disabling-and-enabling-inspections.html#suppress-in-editor
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Linter против WeakReference
От: pva  
Дата: 25.10.23 13:30
Оценка:
Здравствуйте, ·, Вы писали:

pva>>listeners.add(new WeakReference<>(listener));

·>Я надеюсь, это неполный код. Иначе у тебя тут утечка ресурсов — в список что-то добавляется, но никогда не удаляется.
Безусловно, он был бы неполный без unsubscribe и/или периодической чистки от сдохших элементов. Но в данном конкретном случае use-case не предполагает такового. Это синглтон-контейнер, который аггрегирует сигналы своих элементов в одной точке. Подписка идет только при запуске приложения и отписка исключительно при завершении работы.
Насколько я помню деструкторов в джаве нет, а в ондроидах у тебя ОС может вообще без причин грохнуть для экономии электричества и Application не распознает.

pva>>Стандартный линтер из АндроидСтудио. Что-то я про гугление не подумал. Решением оказалось @SuppressWarnings("FieldCanBeLocal")

·>Эээ.. Так ведь там есть intention чтобы suppress warning. Оно само поставит нужную аннотацию в нужное место.
·>https://www.jetbrains.com/help/idea/disabling-and-enabling-inspections.html#suppress-in-editor
Не, в данном случае это не работает. Нет такого элемента в меню.
newbie
Re[5]: Linter против WeakReference
От: · Великобритания  
Дата: 25.10.23 13:36
Оценка: 2 (1)
Здравствуйте, pva, Вы писали:

pva>·>Я надеюсь, это неполный код. Иначе у тебя тут утечка ресурсов — в список что-то добавляется, но никогда не удаляется.

pva>Безусловно, он был бы неполный без unsubscribe и/или периодической чистки от сдохших элементов. Но в данном конкретном случае use-case не предполагает такового. Это синглтон-контейнер, который аггрегирует сигналы своих элементов в одной точке. Подписка идет только при запуске приложения и отписка исключительно при завершении работы.
pva>Насколько я помню деструкторов в джаве нет, а в ондроидах у тебя ОС может вообще без причин грохнуть для экономии электричества и Application не распознает.
Я бы лучше явную отписку писал, можно в try-with-resources и AutoCloseable оборачивать. Всё лучше, чем магические исчезающие ссылки, зависящие от стиля кода.

pva>>>Стандартный линтер из АндроидСтудио. Что-то я про гугление не подумал. Решением оказалось @SuppressWarnings("FieldCanBeLocal")

pva>·>Эээ.. Так ведь там есть intention чтобы suppress warning. Оно само поставит нужную аннотацию в нужное место.
pva>·>https://www.jetbrains.com/help/idea/disabling-and-enabling-inspections.html#suppress-in-editor
pva>Не, в данном случае это не работает. Нет такого элемента в меню.
Стрелочка такая ">" справа от пункта меню. Это там подменю, а не просто закорючка для красоты.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Linter против WeakReference
От: pva  
Дата: 25.10.23 14:31
Оценка:
Здравствуйте, ·, Вы писали:

pva>>Не, в данном случае это не работает. Нет такого элемента в меню.

·> Стрелочка такая ">" справа от пункта меню. Это там подменю, а не просто закорючка для красоты.
Ну вот я тоже помню что было такое подменю. Ха, надо тыкать именно на стрелочку или использовать кнопку клавиатуры -> чтобы открылось меню. Если тыкать мышей именно на верхний пункт, то он просто исполняется.
newbie
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.