Что является предпочтительным способом организовывать обратные вызовы? [закрыто
-
02-10-2019 - |
Вопрос
В моем проекте 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) кажется очевидным выбором:
Другие советы
Я не верю, что есть какой-либо идиоматический способ обрабатывать обратные вызовы.
Я обычно встроен на анонимный класс первым. Когда метод становится слишком большим, я извлекаю создание класса в отдельную функцию. Когда класс становится слишком большим, я извлекаю в свой собственный файл.
Если вы используете IDE, как Eclipse, вы можете автоматически выполнять все эти рефакторины и безопасно.
Как и Чемпион @ Manuel Silva и @toby, я не люблю анонимных внутренних классов. Они несколько трудно читать, не очень «oO», в том, что они не могут быть продлены, не могут иметь погружение, загадки или что-то еще настроить поведение и т. Д. ..., и они часто заканчивают нарушать сухое принцип Когда вы добавляете тот же код в 27 разных местах.
Я склонен использовать частные члены (ваш вариант № 3) или частную функцию (ваш 4-й стиль), как правило, названо GetaSreunnable ().
Я очень новичок в Android, но анонимные классы заставляют меня тошнотыми, и кажется, что вы альтернативы RunOnuithead в любом случае: Asynckask, обсуждаемая здесь:Вопрос в рононутрифирете
С моей точки зрения анонимный класс действительно уменьшает читаемость. Поскольку код пользовательского интерфейса часто очень многословна, добавление анонимных обратных вызовов для каждой кнопки может привести к очень большими классами. Как следствие, я использую внутренние частные классы.