2015-05-20 15 views
6

Si consideri che ho Algorithm enum comeCome restituire un'istanza da Enum?

public enum Algorithm { 
    SHA1("sha1"), 
    HMAC("hmac"),; 

    Algorithm(final String algorithm) { 
    this.algorithm = algorithm; 
    } 
    private final String algorithm; 

    public String getAlgorithm() { 
    return algorithm; 
    } 
} 

e ho diversi algoritmi come

public class Sha1 { 
    public static String hash(final String text, final byte[] sb) {...} 
} 

e

public class Hmac { 
    public static String hash(final String text, final byte[] sb) {...} 
} 

voglio tornare i loro casi in cui qualcuno chiama per esempio

Algorithm.SHA1.getInstance() 

Domanda

  • Come posso restituire l'istanza in quanto il mio metodo è statico? (È statico in modo che più thread non possono giocare con ogni altri dati)
+0

a rendere thread-safe - che dire utilizzando la sincronizzazione? – Razib

+0

Nello stesso modo in cui si aggiunge un metodo getAlgorithm() è anche possibile aggiungere un metodo getInstance(). Puoi implementarlo sull'Enum o sui diversi codici. 'SHA1 (" sha1 ") {X getInstance() {return new Sha1(); }, Hmac ("hmac") {X getInstance() {return new Hmac(); } '(ma questo non ti aiuta molto con un metodo statico - che comunque non è una buona idea in quel caso). – eckes

risposta

6

Non è possibile tornare un esempio, quando il metodo è statico, ma you can make your enum implement an interface, e fare un metodo di istanza che chiama il metodo statico eseguire l'invio virtuale per voi:

public interface EncryptionAlgo { 
    String hash(final String text, final byte[] sb); 
} 

public enum Algorithm implements EncryptionAlgo { 
    SHA1("sha1") { 
     public String hash(final String text, final byte[] sb) { 
      return Sha1.hash(text, sb); 
     } 
    }, 
    HMAC("hmac") { 
     public String hash(final String text, final byte[] sb) { 
      return Hmac.hash(text, sb); 
     } 
    }; 

    Algorithm(final String algorithm) { 
     this.algorithm = algorithm; 
    } 
    private final String algorithm; 

    public String getAlgorithm() { 
     return algorithm; 
    } 
} 

Ora è possibile chiamare hash nell'istanza SHA1 o HMAC, in questo modo:

Algorithm.HMAC.hash(someText, sb); 

o r passare intorno EncryptionAlgo casi, come questo:

EncryptionAlgo algo = Algorithm.SHA1; 
+0

Bene, 'Algorithm' * potrebbe * contenere istanze statiche di' Sha1' e 'Hmac' e restituire l'una o l'altra, supponendo che entrambe le classi implementino l'interfaccia' EncryptionAlgo'. Ma rendere 'Algorithm' * stesso * implementa l'interfaccia sembra meglio, poiché evita la necessità di chiamare' getInstance() '. Un'istanza di enum è già un singleton statico, quindi è stilly usare uno solo per cercare * un altro * statico singleton. – Wyzard

+1

Inoltre, SHA1 e HMAC sono funzioni hash, non algoritmi di crittografia. L'interfaccia 'EncryptionAlgo' sarebbe meglio chiamata qualcosa come' HashFunction'. – Wyzard

+0

In realtà non è necessario l'interfaccia. Puoi semplicemente avere il metodo sul tipo enum direttamente. –