Вопрос-ответ

Converting many 'if else' statements to a cleaner approach [duplicate]

Преобразование многих операторов 'if else' в более чистый подход

Мой код здесь определяет, соответствует ли mimeType некоторому типу MIME, если это так, он выполнит определенное преобразование

public void convertToMp3(File src, File target,String mimeType){
if(mimeType.equals("audio/mpeg")){
...
}else if(mimeType.equals("audio/wav")){
mp3ToWav();
}else if(mimeType.equals("audio/ogg")){
...
}else if(...){
... //More if and else here
}

Я сократил свой код, потому что в нем много операторов else if, какой шаблон проектирования подходит для удаления многих операторов if и else или else if?

Переведено автоматически
Ответ 1

У вас мог бы быть Converter интерфейс. Затем вы могли бы создать класс для каждого Mimetype, например:

public interface Converter {

public void convertToMp3();
public void convertToOgg();

}

public class MpegConverter implements Converter {

public void convertToMp3() {
//Code here
}

public void convertToOgg() {
//Code here
}

}

Вам понадобится подобный класс для каждого преобразователя. Затем вы могли бы настроить карту следующим образом:

Map<String, Converter> mimeTypeMap = new HashMap<String, Converter>();

mimeTypeMap.put("audio/mpeg", new MpegConverter());

Тогда ваш convertToMp3 метод становится таким:

Converter converter = mimeTypeMap.get(mimeType);
converter.convertToMp3();

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

Все непроверенные, вероятно, не компилируются, но вы поняли идею

Ответ 2

Если вы используете версию, предшествующую JDK7, вы можете добавить перечисление для всех типов MIME:

  public static enum MimeTypes {
MP3, WAV, OGG
}

public class Stuff {
...
switch (MimeTypes.valueOf(mimeType)) {
case MP3: handleMP3(); break;
case WAV: handleWAV(); break;
case OGG: handleOGG(); break;
}
}

И взгляните на вопрос Stack Overflow Java - Convert String to enum о том, как преобразовать строки в перечисления.

Ответ 3

Рассмотрите возможность использования шаблона разработки стратегии и Map для отправки в соответствующую стратегию. Особенно полезно, если вам потребуется дополнительная функциональность в дополнение к преобразованию для определенного mimeType кода, или конвертеры представляют собой большой и сложный код, и вы хотели бы поместить каждый конвертор в отдельный .java файл.

 interface Convertor {
void convert(File src, File target);
}

private static void convertWav(File src, File target) {
...
}

...

private static final Map< String, Convertor > convertors = new ...;
static {
convertors.put("audio/wav", new Convertor {
void convert(File src, File target) {
convertWav(src, target);
}
});
convertors.put("audio/ogg", new Convertor {
void convert(File src, File target) {
convertOgg(src, target);
}
});
...
}

public void convertToMp3(File src, File target, String mimeType){
final Convertor convertor = convertors.get(mimeType);
if (convertor == null ) {
...
} else {
convertor.convert(src, target);
}
}
Ответ 4

Если вы запускаете одни и те же методы для каждого случая, вам следует проверить шаблон состояния

java