Convirtiendo muchas declaraciones ‘if else’ a un enfoque más limpio

Mi código aquí detecta si el mimeType es igual a algún tipo MIME ; si lo es, hará una cierta conversión

 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 } 

He acortado mi código, porque tiene muchas otras declaraciones if , ¿Qué patrón de diseño es adecuado para eliminar muchas sentencias if if y else if if ?

Podrías tener una interfaz de Converter . Entonces podrías crear una clase para cada tipo de Mimetype como:

 public interface Converter { public void convertToMp3(); public void convertToOgg(); } public class MpegConverter implements Converter { public void convertToMp3() { //Code here } public void convertToOgg() { //Code here } } 

Necesitarías una clase como esta para cada convertidor. Entonces podrías configurar un mapa como este:

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

Entonces su método convertToMp3 es así:

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

Usando este enfoque, podría agregar fácilmente diferentes conversores en el futuro.

Todo no probado, probablemente no comstack, pero se entiende la idea

Si usa pre-JDK7, puede agregar una enumeración para todos los tipos 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; } } 

Y eche un vistazo a la pregunta sobre desbordamiento de stack Java – Convertir cadena a enum sobre cómo convertir cadenas en enumeraciones.

Considere usar el patrón de diseño de Estrategia y un Map para enviarlo a la estrategia adecuada. Particularmente útil si necesita funcionalidad adicional, además de una conversión para un mimeType particular, o los convertidores son códigos grandes y complicados y usted querría colocar cada convertidor en su propio archivo .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); } } 

Si ejecuta los mismos métodos para cada caso , debe verificar el patrón de estado

Si está utilizando JDK 7 , puede usar la construcción switch-case :

Ver: ¿Por qué no puedo activar una Cadena?

Para versiones anteriores, if-else es la única opción.

Definitivamente es un patrón de diseño de Estrategia. Pero tienes un gran problema en tu diseño general. No es un buen hábito de progtwigción usar String para identificar un tipo. Simplemente porque es fácilmente editable y puedes cometer un error de gramática y pasar toda la tarde buscando un error de progtwigción. Puede evitar el uso de map <>.

Sugiero lo siguiente:

  1. Extender clase Archivo. La nueva clase agrega un nuevo atributo FileType y un nuevo método convertTo (FileType) a la clase File. Este atributo tiene su tipo: “audio”, “wav” … y nuevamente no usa String, Use Enum. En este caso lo llamé FileType. Extienda el archivo tanto como desee: WavFile, AudioFile …
  2. Usa una estrategia dp para crear tus convertidores.
  3. Use un Factory dp para inicializar los convertidores.
  4. Como cada archivo conoce su propio tipo y el tipo de destino (use el método convertTo () para especificar el tipo de destino) llamará a la fábrica para obtener el convertidor correcto automáticamente.

Este diseño es escalable y puede agregar tanto como necesite FileType y convertidores. ¡La respuesta por la que vota es engañosa! Hay una gran diferencia entre encoding y piratería.

Si no está utilizando Java 7, puede crear una enum y usar ese valor con un switch . Entonces solo necesita pasar el valor enum (en lugar de un archivo, no sé por qué lo está haciendo). Se vería más ordenado también.

Esto debería ayudar con lo que quiere hacer:

  [Java Enum Examples][1] - [Java Switch Case examples][2]