Что-то не так со статическим полем, инициализированным анонимным внутренним классом? - PullRequest
0 голосов
/ 20 сентября 2018

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

Но я чувствую, что у этого кода есть какой-то недостаток, и я не могу найтиЭто.Это просто не обычный шаблон или есть какие-то скрытые ловушки или утечки памяти?

private static final Foo action =  new Foo() {

    @Override
    public void onAction(MyDialogFragment fragment) {
        if (fragment.getContext() != null) {
            fragment.getActivity().finish();
        }
    }
};

Этот код используется во фрагменте

ОБНОВЛЕНИЕ: Я подозреваю, что объект анонимного внутреннего класса имеетссылка на родительский фрагмент, и поскольку объект этого класса сохранен в статическом поле, он никогда не будет собран, поэтому родительский фрагмент также никогда не будет собран.Мои рассуждения неверны?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

В этом подходе нет ничего плохого, поскольку логика имеет дело только со значениями, передаваемыми в качестве параметров.Использование static просто избегает создания нескольких экземпляров класса Foo.

0 голосов
/ 20 сентября 2018

Да, есть.Лучше получить фрагмент так:

MyDialogFragment fragment = MyDialogFragment.instance();
fragment.setNavigator(this);
getSupportFragmentManager().beginTransaction().replace(R.id.activity_myDialog_layout, fragment).commit();

Есть лучший способ.Вы можете создать 3 класса и интерфейс, который будет реализован этими 3 классами.Деятельность, фрагмент и ведущий.Интерфейс будет Контрактом.Это более продвинутый.

...