Что является предпочтительным способом организовывать обратные вызовы? [закрыто

StackOverflow https://stackoverflow.com/questions/3718769

Вопрос

В моем проекте Android я определяю несколько обратных вызовов для работы на кликах кнопки, событиях подключения или событиями пользовательского интерфейса, такими как Dilaog.onshow (). Для демонстрационных целей я выбрал интерфейс Runnable, который должен быть запущен из некоторого кода активности. С Java у меня разные способы выразить себя.

Один шаблон будет использовать анонимный класс

runOnUiThread(new Runnable() { 
    public void run() { 
        doSomething(); 
    }
});

private void doSomething() {
}

другой - определить внутренний частный класс, то есть

private DoSomething implements Runnable {
    public void run() { 
        // do something; 
    }
}
...
runOnUiThread(new DoSomething());

Еще один - использовать частный член, как это:

private final Runnable doSomething = new Runnable() {
    public void run() { 
        // do something; 
    }
}
...
runOnUiThread(doSomething);

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

private Runnable doSomething() { 
    return new Runnable() {
        public void run() { 
            // do something; 
        }
    }
}
...
runOnUiThread(doSomething());

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

Спойлер:

Прогресс Java оказал этот вопрос устаревший, увидеть принятый ответ.

Это было полезно?

Решение 5

Сегодня, когда Java 8 почти доступен для Android, а Android Studio автоматически Притворяется, что лямбдас уже поддерживается, решение анонимного класса (№ 1) кажется очевидным выбором:

collapsed

expanded

Другие советы

Я не верю, что есть какой-либо идиоматический способ обрабатывать обратные вызовы.

Я обычно встроен на анонимный класс первым. Когда метод становится слишком большим, я извлекаю создание класса в отдельную функцию. Когда класс становится слишком большим, я извлекаю в свой собственный файл.

Если вы используете IDE, как Eclipse, вы можете автоматически выполнять все эти рефакторины и безопасно.

Как и Чемпион @ Manuel Silva и @toby, я не люблю анонимных внутренних классов. Они несколько трудно читать, не очень «oO», в том, что они не могут быть продлены, не могут иметь погружение, загадки или что-то еще настроить поведение и т. Д. ..., и они часто заканчивают нарушать сухое принцип Когда вы добавляете тот же код в 27 разных местах.

Я склонен использовать частные члены (ваш вариант № 3) или частную функцию (ваш 4-й стиль), как правило, названо GetaSreunnable ().

Я очень новичок в Android, но анонимные классы заставляют меня тошнотыми, и кажется, что вы альтернативы RunOnuithead в любом случае: Asynckask, обсуждаемая здесь:Вопрос в рононутрифирете

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top