J'ai créé un code, qui doit convertir ContentDataType en types MIME. Par exemple - ContentDataType est un simple String comme ImageJPEG et maintenant j'utilise MediaType.IMAGE_JPEG_VALUE pour le convertir en image/jpeg. Mais j'utilise switch pour ce faire. Ceci est un code:

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

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

Quelle est la meilleure et élégante façon de faire cela? Je ne veux pas utiliser if, mais peut-être un polymorphisme? Pouvez-vous me donner des indices?

2
allocer 17 janv. 2017 à 10:31

2 réponses

Meilleure réponse

Si vous êtes prêt à n'en utiliser qu'un seul if/else, vous pouvez faire quelque chose comme ceci:

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

Cela vous permet d'ajouter de nouveaux types pris en charge dans la table de hachage sans avoir à gérer une longue séquence de if/else if/else.

3
Guillaume Barré 17 janv. 2017 à 07:44

Ce type d'opération doit être utilisé Enum.

Si vous disposez de toutes les options possibles connues pour votre ContentDataType, créez une énumération pour celui-ci.

Ensuite, vous pouvez stocker la chaîne ainsi que le type MIME. comme ci-dessous,

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

Ou vous pouvez utiliser l'objet MimeType ainsi que ci-dessous

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;
    }
}
1
Anil Agrawal 17 janv. 2017 à 07:58