Java'da numaralandırma: Tekil mi Çoğul mu?


184

Java numaralandırmalarının adlandırılmasına ilişkin "resmi" bir öneri var mı?

enum Protocol { HTTP, HTTPS, FTP }

veya

enum Protocols { HTTP, HTTPS, FTP }

.Net dünyasında tavsiye bit bayrakları temsil eden numaralar dışında tekil kullanmak olduğunu biliyorum. Sadece Java'da benzer bir şey olup olmadığını merak ediyorum.

.Net'e özgü gibi görünen ilgili bir soru: Numaralandırmalar için tekil mi yoksa çoğul mu?


3
Cevabı burada bulabilirsiniz . Numaralamalar sınıflardır, yani aynı şekilde beyan etmelisiniz.
bsiamionau

Yanıtlar:


220

Java'daki numaralandırmalar (ve büyük olasılıkla genel olarak numaralandırmalar) tekil olmalıdır. Düşünme, birden çok Protokol seçmemeniz, daha ziyade değerler listesindeki olası seçeneklerin bir Protokolünü seçmenizdir.

Çoğulların olmadığına dikkat edin: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html


2
Microsoft, .NET programlama hakkında kabaca aynı görüşe sahip görünüyor: stackoverflow.com/a/1336012/279112
Panzercrisis

TimeUnit nasıl çoğul kullanır? örneğin: DAYS, HOURS...
theyuv

5
Değerler çoğuldur, enum kendisi değildir :-)
Calvin

21

Aynı şekilde, bir veritabanında veya Java'da bir sınıfta bir tablo adı tanımlarken, numaralandırmalar için tekil kullandığınızda da en iyi seçenektir. Sadece nasıl kullanacağınıza bakın.

Bir örnek yazalım:

public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

class Appointment {
private Day day;

public void setDay(Day day) {
    this.day = day;
}
}

Tekil formda, gün özelliğinin amacını açıkça görürsünüz. "gün" bu randevu yapılacak haftanın günü. Aksi takdirde yöntemin imzası ayarlanmıştıGün (Gün günü) ve kesin olarak birçok insan randevunun bir günden fazla olup olmayacağını merak edecektir.

48 saat vardiyası olan bir şirkette çalışıyorsanız, aşağıdaki gibi bir şey tanımlamaya çalışabilirsiniz:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Bu şekilde çalışacağınız günleri ayarlayabilirsiniz. Ama yine de garip görünecek ve daha iyi bir seçenek var ve tekil formu kullanmaktır:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Şimdi gerçekten sıralamanın anlamını gösteriyorsun. Genellikle herhangi bir alanda, bir numaralandırma için tekil kullanmanın en iyi seçenek olduğunu göreceksiniz çünkü enumdaki her sabit sadece bir elementtir.

.NET'ten de bahsediyorsunuz. .NET'te bir "bayraklar" numaralaması, yalnızca bu numaralandırmayı bir parametre olarak beklediğinizde, aldığınız öğenin (tamsayı olarak depolanan) öğelerinin bir listesi olduğu anlamına gelir.

// Define an Enum with FlagsAttribute.
[FlagsAttribute] 
enum MultiHue : short
{
    Black = 0,
    Red = 1,
    Green = 2,
    Blue = 4
};

public void setMultiHue(MultiHue hues);

Java'da da aynısını yapabilirsiniz, ancak numaralandırma hala tekil olacaktır:

public enum Hue {
BLACK, RED, GREEN, BLUE;
private final Integer hue;

Hue() {
    this.hue = 1 << this.ordinal();
}

public Integer toFlag() {
    return this.hue;
}
}

public class MultiHue {
private Integer hues = 0;

public void addHue(Hue hue) {
    this.hues |= hue.toFlag();
}

public boolean hasHue(Hue hue) {
    return (this.hues & hue.toFlag()) != 0;
}
}

Java ile bunu yapmak daha kolay ve net (daha fazla bellek kullanıyor olsa da) sadece bir Liste kullanmaktır.


2
Aslında bunu yapmanın daha iyi bir yolu, bir BitSet'i içine alan ve sizin için bunların hepsini halleden bir EnumSet olacaktır. :-)
corsiKa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.