将许多“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模式适合去除许多if和else或else语句?
你可以有一个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议如下:
- 扩展类文件。 新类将一个新的属性FileType和一个新的方法convertTo(FileType)添加到类File中。 这个属性保存它的types:“audio”,“wav”…并且不要使用String,Use Enum。 在这种情况下,我把它叫做FileType。 尽可能扩展文件:WavFile,AudioFile …
- 使用策略dp来创build您的转换器。
- 使用工厂dp来初始化转换器。
- 由于每个文件知道它自己的types和目标types(使用convertTo()方法来指定目标types),它会自动调用工厂来获得正确的转换器!
这种devise是可扩展的,你可以添加尽可能多的文件types和转换器。 你投票的答案是误导! 编码和黑客有很大区别。
如果你不使用Java 7,你可以创build一个enum
值,并使用switch
大小写的值。 你只需要传递枚举值(而不是一个文件,我不明白为什么你这样做)。 它会看起来更整洁。
这些应该可以帮助你做什么:
[Java Enum Examples][1] - [Java Switch Case examples][2]