当前位置: 首页 > 知识库问答 >
问题:

将许多“if else”语句转换为更简洁的方法[重复]

荆树
2023-03-14

这里我的代码检测< code>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语句?

共有3个答案

蒋胡非
2023-03-14

考虑使用策略设计模式和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);
     }
 }
公冶弘壮
2023-03-14

如果使用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;
      }
  }

看看堆栈溢出问题Java-将字符串转换为枚举,了解如何将字符串转换为枚举。

钱和平
2023-03-14

您可以有一个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());

然后,您的< code>convertToMp3方法变成这样:

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

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

所有未经测试,可能无法编译,但你得到的想法

 类似资料:
  • 问题内容: 我的代码在这里检测the 是否等于某种MIME类型,如果是,它将进行一定的转换 我缩短了代码,因为它包含许多其他if语句,哪种设计模式适合于删除许多if and else or else if语句? 问题答案: 你可以有一个接口。然后,你可以为每个Mimetype创建一个类,如下所示: 每个转换器都需要一个这样的类。然后,你可以像这样设置地图: 然后,你的convertToMp3方法将

  • 问题内容: 像这样的MySQL查询: 我想将其转换为雄辩的laravel,但我很困惑。因为存在很多陈述。存在,,,等你可以看到上面的查询 如何将其转换为雄辩的laravel? 问题答案: 主要是原始查询: 尝试这个:

  • 问题内容: 例如,我目前正在这样做: 你能打败这个吗? 问题答案:

  • 问题内容: 在我的应用程序中,我使用3rd party库(确切地说是MongoDB的Spring数据)。 该库的方法返回,而我的其他代码则期望。 有什么实用方法可以让我快速将一个转换为另一个吗?我想避免foreach在代码中创建这么简单的循环。 问题答案: 在JDK 8+中,不使用任何其他库: 编辑:上面的是Iterator。如果您正在处理Iterable,

  • 问题内容: 假设我有一个包含要转换为指标的字符串的数据框。我用来将其转换为现在可用于构建模型的数据集。 现在,我有一个新的观察值,我想遍历我的模型。显然,我无法使用它,因为它不包含所有类,并且不会创建相同的指标矩阵。有什么好方法吗? 问题答案: 您可以从单个新观察值创建虚拟对象,然后使用原始指标矩阵中的列重新索引此框架列: 返回:

  • 问题内容: 我通常这样做是将字符串转换为int: 但我想知道是否有一种比较笨拙的方法,因为它感觉很长。 问题答案: 没有比使用该函数更短的方法了(如您所述)