如何用更好的解决方案替换switch语句 - 清除代码提示

时间:2017-01-17 07:31:15

标签: java coding-style switch-statement refactoring

我创建了一个代码,必须将ContentDataType转换为MIME类型。例如,ContentDataType就像String一样简单ImageJPEG,现在我使用MediaType.IMAGE_JPEG_VALUE将其转换为image/jpeg。但是我用switch来做这件事。这是一个代码:

 public static String createContentType(ContentDataType contentDataType) {
        String contentType;

        switch (contentDataType) {          
            case IMAGE_JPG:
                contentType = MediaType.IMAGE_JPEG_VALUE;
                break;
            //next media types
        }
    return contentType;
 }

这样做有什么更好,更优雅的方法?我不想使用if,但也许有些多态?你能给我一些提示吗?

2 个答案:

答案 0 :(得分:3)

如果您准备只使用一个if/else,您可以执行以下操作:

private static Hashtable<String, String> types = new Hashtable<>();

static{
    types.put(IMAGE_JPG, MediaType.IMAGE_JPEG_VALUE);
    types.put(IMAGE_PNG, MediaType.IMAGE_PNG_VALUE);
    types.put(IMAGE_XXX, MediaType.IMAGE_XXX_VALUE);
}

public static String createContentType(ContentDataType contentDataType) {
    if types.containsKey(contentDataType) 
        return types.get(contentDataType);
    else
        throw new RuntimeException("contentDataType not supported");
    }
}

这允许您将新支持的类型添加到Hashtable whitout中,该类型必须处理一长串if/else if/else

答案 1 :(得分:1)

此类操作应使用Enum。

如果您拥有ContentDataType的所有已知可能选项,则为其创建枚举。

然后您可以存储字符串以及MIME类型。如下,

enum ContentDataType{
    IMAGE_JPG("ImageJPG", "image/jpg"),
    IMAGE_GIF("ImageGIF", "image/gif");
    String contentType;
    String mimeType;
    ContentDataType(String contentType, String mimeType){
        this.contentType = contentType;
        this.mimeType = mimeType;
    }
}

或者您可以使用MimeType对象以及

import com.google.common.net.MediaType;
enum ContentDataType{
    IMAGE_JPG("ImageJPG", MediaType.JPEG),
    IMAGE_GIF("ImageGIF", MediaType.GIF);
    public String contentType;
    public MediaType mimeType;
    ContentDataType(String contentType, MediaType mimeType){
        this.contentType = contentType;
        this.mimeType = mimeType;
    }
}