J'ai la classe Enum comme ci-dessous

public enum AlgorithmEnum {

    SHA512("RSA", "SHA512", 1), SHA1("RSA", "SHA1", 1), SHA384("RSA", "SHA384", 1);

    private String keyAlgorithm;
    private String hashAlgorithm;
    private Integer key;

    private AlgorithmEnum(String keyAlgorithm, String hashAlgorithm, Integer key) {
        this.keyAlgorithm = keyAlgorithm;
        this.hashAlgorithm = hashAlgorithm;
        this.key = key;
    }

    public String getKeyAlgorithm() {
        return keyAlgorithm;
    }

    public void setKeyAlgorithm(String keyAlgorithm) {
        this.keyAlgorithm = keyAlgorithm;
    }

    public String getHashAlgorithm() {
        return hashAlgorithm;
    }

    public void setHashAlgorithm(String hashAlgorithm) {
        this.hashAlgorithm = hashAlgorithm;
    }

    public Integer getKey() {
        return key;
    }

    public void setKey(Integer key) {
        this.key = key;
    }
}

J'ai besoin d'une méthode comme ci-dessous qui prend l'entrée sous forme de chaîne et renvoie Enum

public AlgorithmEnum getAlgorithm(String algorithm){
        //returns AlgorithmEnum object
    }

J'appellerais la méthode ci-dessus en passant "SHA512withRSA" comme entrée pour la méthode getAlgorithm.

J'ai besoin d'aide pour implémenter la méthode getAlgorithm.

0
rocky 20 nov. 2018 à 11:27

4 réponses

Meilleure réponse

Vous pouvez avoir quelque chose comme:

public static AlgorithmEnum getAlgorithm(final String algorithm)
        throws IllegalArgumentException
    {
        for (final AlgorithmEnum algorithmEnum : AlgorithmEnum.values())
        {
            if (algorithm.equalsIgnoreCase(String.format("%swith%s", algorithmEnum.getHashAlgorithm(), algorithmEnum.getKeyAlgorithm())))
            {
                return algorithmEnum;
            }
        }
        throw new IllegalArgumentException("Unknown algorithm: " + algorithm);
    }

Cependant, je ne suggérerai pas d'utiliser cette approche. Utilisez plutôt 2 arguments différents au lieu d'une seule chaîne.

1
Karan Khanna 20 nov. 2018 à 08:39

En supposant que toutes les valeurs de chaîne transmises à votre méthode getAlgorithm() se terminent par withRSA, vous pouvez utiliser ce qui suit pour récupérer les valeurs d'énumération:

public AlgorithmEnum getAlgorithm(String algorithm) {
    return AlgorithmEnum.valueOf(algorithm.substring(0, algorithm.indexOf("withRSA")));
}
1
Nicholas K 20 nov. 2018 à 08:37

Vous pouvez vérifier si le String donné contient une valeur qui correspond à l'un des attributs enum avec des instructions if:

public AlgorithmEnum getAlgorithm(String algorithm) {
    if (algorithm.contains("SHA1")) {
        return SHA1;
    } else if (algorithm.contains("SHA512")) {
        return SHA512;
    } else if (algorithm.contains("SHA384")) {
        return SHA384;
    } else {
        return null;
    }
}

Veuillez noter que cela correspondra également à des String comme "SHA512withoutRSA" ...

Peut-être une méthode comme

public AlgorithmEnum getAlgorithm(String keyAlgorithm, String hashAlgorithm)

Serait mieux. Cependant, vous devrez alors fournir deux paramètres.

0
deHaar 20 nov. 2018 à 08:40

Je vous laisse un exemple de comment j'ai fait sur des cas similaires, vous pouvez facilement l'adapter à vos besoins:

private static Map<Integer, YourEnum> valuesById = new HashMap<>();
private static Map<String, YourEnum> valuesByCode = new HashMap<>();

    static {
        Arrays.stream(YourEnum.values()).forEach(value -> valuesById.put(value.reasonId, value));
        Arrays.stream(YourEnum.values()).forEach(value -> valuesByCode.put(value.reasonCode, value));
    }


    public static YourEnum getByReasonId(int endReason) {
        return valuesById.get(endReason);
    }
0
Andrea Calin 20 nov. 2018 à 08:41