2015-05-20 16 views
6

Ben Algorithm enum Örnek, Enum'dan nasıl geri dönülür?

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

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

    public String getAlgorithm() { 
    return algorithm; 
    } 
} 

olarak var ve

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

ve

Birisi örneğin

için çağırdığında onların örneklerini dönmek istiyorum
public class Hmac { 
    public static String hash(final String text, final byte[] sb) {...} 
} 

gibi farklı algoritmalar sahip olduğunu düşünün

Algorithm.SHA1.getInstance() 
Benim yöntem statik olduğundan

Soru

  • nasıl örneğini dönebilirsiniz? (Birden iplikleri birbiri verilerle etrafında çalamaz böylece durağandır)
+0

İş parçacığı güvenli hale getirmek için - senkronizasyonu kullanma hakkında ne var? – Razib

+0

Bir getAlgorithm() yöntemini eklediğiniz gibi, bir getInstance() yöntemi de ekleyebilirsiniz. Bunu Enum veya farklı şifrelere uygulayabilirsiniz. SHA1 ("sha1") {X getInstance() {return new Sha1(); }, Hmac ("hmac") {X getInstance() {return new Hmac(); } '(Ancak bu, statik bir yöntemle size pek yardımcı olmaz - bu durumda zaten iyi bir fikir değildir). – eckes

cevap

6

Sen yöntem statik olduğunda bir örneğini döndürür, ancak you can make your enum implement an interface ve gerçekleştirmek statik yöntemini çağıran bir örnek yöntemini yapamaz sizin için sanal sevk:

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

Şimdi böyle, SHA1 veya HMAC örneğinde hash çağırabilirsiniz:

Algorithm.HMAC.hash(someText, sb); 

o r aşağıdaki gibi EncryptionAlgo örneklerini geçirin:

EncryptionAlgo algo = Algorithm.SHA1; 
+0

Eh, 'Algoritma * *, hem Sha1 hem de Hmac'ın statik örneklerini içerebilir ve her iki sınıfın da“ EncryptionAlgo ”arayüzünü uyguladığı varsayılarak, birini veya diğerini döndürür. Ancak 'Algorithm' * 'in kendisini * kurabilmesi, arayüzü daha iyi bir hale getirir, çünkü getInstance() 'i çağırmaktan kaçınır. Bir enum örneği zaten bir statik tekildir, bu yüzden sadece bir başka * statik singletonu aramak için kullanmaktır. – Wyzard

+1

Ayrıca, SHA1 ve HMAC şifreleme algoritmaları değil, karma işlevlerdir. 'EncryptionAlgo' arayüzü 'HashFunction' gibi bir şey daha iyi adlandırılmış olurdu. – Wyzard

+0

Arabirime gerçekten ihtiyacınız yok. Enum türü üzerinde doğrudan yöntemi kullanabilirsiniz. –

İlgili konular