将许多“if else”语句转换为更清晰的方法

我的代码在这里检测,如果mimeType是等于一些MIMEtypes,如果是,它将做一定的转换

 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 } 

我已经缩短了我的代码,因为它有很多其他的if语句,什么样的devise模式适合去除许多ifelseelse语句?

你可以有一个Converter界面。 然后你可以为每个Mime类创build一个类,如下所示:

 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(); 

使用这种方法,您可以在将来轻松添加不同的转换器。

所有未经testing,可能不会编译,但你明白了

如果您使用JDK7以前版本,则可以为所有MIMEtypes添加枚举:

  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; } } 

并看看堆溢出问题的Java – 转换string枚举如何将string转换为枚举。

考虑使用策略devise模式和Map来分派适当的策略。 特别有用的,如果你需要额外的function,除了一个特定的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); } } 

如果你为每个案例运行相同的方法,你应该检查状态模式

如果您使用的是JDK 7 ,则可以使用switch-case构造:

请参阅: 为什么我不能打开一个string?

对于以前的版本, if-else是唯一的select。

这绝对是一个策略devise模式。 但是你的总体devise有一个很大的问题。 使用String来识别types不是一个好的编程习惯。 只是因为它很容易编辑,你可以犯一个语法错误,花了整个下午寻找一个编程错误。 你可以避免使用map <>。

我build议如下:

  1. 扩展类文件。 新类将一个新的属性FileType和一个新的方法convertTo(FileType)添加到类File中。 这个属性保存它的types:“audio”,“wav”…并且不要使用String,Use Enum。 在这种情况下,我把它叫做FileType。 尽可能扩展文件:WavFile,AudioFile …
  2. 使用策略dp来创build您的转换器。
  3. 使用工厂dp来初始化转换器。
  4. 由于每个文件知道它自己的types和目标types(使用convertTo()方法来指定目标types),它会自动调用工厂来获得正确的转换器!

这种devise是可扩展的,你可以添加尽可能多的文件types和转换器。 你投票的答案是误导! 编码和黑客有很大区别。

如果你不使用Java 7,你可以创build一个enum值,并使用switch大小写的值。 你只需要传递枚举值(而不是一个文件,我不明白为什么你这样做)。 它会看起来更整洁。

这些应该可以帮助你做什么:

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