2010-09-15 4 views
4

В моем проекте 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); 

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

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

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

Спойлер:

Прогресс Java вынес этот вопрос устарел, см принятого ответа.

+1

Релевантно: [Это конец \ [качество кода \]?] (Http://meta.stackoverflow.com/q/313767/4639281). Если вы можете отредактировать этот вопрос, чтобы сложить его так, чтобы он не основывался на мнениях, и удалил тег [tag: code-quality], тогда я бы отменил свое закрытое голосование (или проголосовал за повторное открытие, если он снова закрылся). –

+0

Извините, я понятия не имел об этой проблематичной теге. –

+0

Ваш вопрос по-прежнему имеет слишком выраженную формулировку. Я уверен, что его можно отредактировать, чтобы этого не было, но это зависит от вас. –

ответ

0

Сегодня, когда Java 8 почти для Android и Android-студия automagically делает вид, что лямбды уже поддерживаются, анонимный класс (# 1) решение представляется очевидным выбором:

collapsed

expanded

0

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

+0

Спасибо, я исправил первый пример, чтобы лучше выразить идею: анонимный обратный вызов в моем случае просто вызывает частный метод, менее вероятно, два. –

1

Я очень новой для Android, но анонимные классы делают меня тошнило, и это, кажется, у Вас есть альтернатива runOnUiThread в любом случае: AsyncTask, обсуждается здесь: runOnUIThread question

+0

Спасибо за указатель –

2

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

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

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

2

Как @Manuel Silva и @Toby Champion, я не люблю анонимные внутренние классы. Их трудно читать, они не очень «OO», поскольку они не могут быть расширены, не могут иметь DIP, сеттеры или что-то еще, чтобы изменить поведение и т. Д., И они часто нарушают принцип DRY когда вы добавляете тот же код в 27 разных местах.

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

Смежные вопросы