2015-05-20 8 views
6

Uważają, że mam Algorithm enum jakoJak zwrócić instancję z Enum?

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

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

    public String getAlgorithm() { 
    return algorithm; 
    } 
} 

i mam różne algorytmy jak

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

i

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

Chcę wrócić do swoich wystąpień, gdy ktoś dzwoni na przykład

Algorithm.SHA1.getInstance() 

Pytanie

  • Jak mogę powrócić instancję ponieważ moja metoda jest statyczna? (To jest statyczna, tak że wiele wątków nie mogą bawić się ze sobą danych)
+0

Aby czyni go wątku bezpieczne - co o użyciu synchronizacji? – Razib

+0

W ten sam sposób, w jaki dodajesz metodę getAlgorithm(), możesz również dodać metodę getInstance(). Możesz to zaimplementować w Enum lub na różnych szyfrach. 'SHA1 (" sha1 ") {X getInstance() {return new Sha1(); }, Hmac ("hmac") {X getInstance() {return new Hmac(); } '(ale to nie pomoże ci w statycznej metodzie - i tak w tym przypadku nie jest to dobry pomysł). – eckes

Odpowiedz

6

Nie możesz powrócić instancji, gdy metoda jest statyczna, ale you can make your enum implement an interface i uczynić metodę instancji, który wywołuje metodę wykonywania statycznych wirtualny sklep dla Ciebie:

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

teraz można zadzwonić hash na przykład SHA1 lub HMAC, tak:

Algorithm.HMAC.hash(someText, sb); 

o r przechodzić wokół EncryptionAlgo instancji w następujący sposób:

EncryptionAlgo algo = Algorithm.SHA1; 
+0

Cóż, 'Algorytm' * może * zawierać statyczne instancje zarówno' Sha1' i 'Hmac' i zwracać jeden lub drugi, przy założeniu, że obie te klasy implementują interfejs' EncryptionAlgo'. Ale sama implementacja 'Algorith' * implementacji interfejsu wydaje się lepsza, ponieważ unika potrzeby wywoływania' getInstance() '. Enum instancja jest już statycznym singleton, więc jest bardzo trudne, aby użyć jednego, aby wyszukać * inny * statyczny singleton. – Wyzard

+1

Ponadto SHA1 i HMAC są funkcjami mieszającymi, a nie algorytmami szyfrowania. Interfejs 'EncryptionAlgo' będzie lepiej nazwać coś w stylu' HashFunction'. – Wyzard

+0

Nie potrzebujesz interfejsu. Możesz po prostu mieć metodę bezpośrednio na typie wyliczeniowym. –