SORU
15 Mart 2011, Salı


Ters bakmak-up en iyi uygulama Java numaralama

Aşağıdaki "ters arama" Java getCode(int) kullanarak Sırala: . mantıklı bir yol oldu suggested on a blog gördüm

public enum Status {
    WAITING(0),
    READY(1),
    SKIPPED(-1),
    COMPLETED(5);

    private static final Map<Integer,Status> lookup 
            = new HashMap<Integer,Status>();

    static {
        for(Status s : EnumSet.allOf(Status.class))
            lookup.put(s.getCode(), s);
    }

    private int code;

    private Status(int code) {
        this.code = code;
    }

    public int getCode() { return code; }

    public static Status get(int code) { 
        return lookup.get(code); 
    }
}

Bana, statik harita ve statik başlatıcı kötü bir fikir gibi görünüyor, hem de ilk aklıma gelen arama olarak yani kod şöyle olacaktır:

public enum Status {
    WAITING(0),
    READY(1),
    SKIPPED(-1),
    COMPLETED(5);

    private int code;

    private Status(int code) {
        this.code = code;
    }

    public int getCode() { return code; }

    public static Status get(int code) { 
        for(Status s : values()) {
            if(s.code == code) return s;
        }
        return null;
    }
}

Her iki yöntemde de herhangi bir bariz sorunları, ve orada önerilen bir yol arama bu tür bir uygulama var mı?

CEVAP
15 Mart 2011, Salı


Daha yüksek bir yük olmasına rağmen, statik göster code Sabit zamanlı arama sağlar, çünkü güzel. Uygulamanız doğrusal numaralama elemanları sayısı ile arama süresini artırır. Küçük numaralamalar için, bu sadece önemli ölçüde katkı sağlayacaktır.

Hem uygulamaları (ve belki de genel olarak Java çeteleler ile) gerçekten Status Bir kabul gizli ekstra bir değeri yok yani tek sorun: null. İş mantık kurallarına bağlı olarak, gerçek anlamda bir numaralama değerini döndürür, ya da bir AT için arama "başarısız." Exception, yapabilir

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • boogie2988

    boogie2988

    6 NİSAN 2006
  • olinerd

    olinerd

    23 AĞUSTOS 2007