簡體   English   中英

Java 幾個枚舉作為getter/setter

[英]Java several enums as getter/setter

我想使用枚舉 class 將書籍格式分配給書籍 object。 我遇到的問題是有些書有一種格式,而另一些有幾種。

public enum Format {
    HARD_COVER, PAPERBACK, E_BOOK, AUDIOBOOK
}

假設第一本書只有一種格式,而第二本書有所有格式。 如何用 getter/setter 解決它?

如何用 getter/setter 解決它?

我不會這樣做,因為根據我的經驗,getter 和 setter 用於設置單個屬性。 如果我有一個需要屬性集合的 class,那么我會讓 class 包含一個列表:

List<Format> formats = new ArrayList<>();

接着:

public void addFormat(Format format) {
    formats.add(format);  // add to the ArrayList of Format
}

以及類似的用於從列表中刪除的removeFormat(Format format)方法。


編輯:正如 Dorian Gray 在評論中正確指出的那樣,格式集合最好是Set<Format> initialized as an因為這樣可以防止將重復的格式添加到集合中。

Set<Format> formatSet = EnumSet.noneOf(Format.class);

您可以使用按位運算符來擁有一個可能具有多個值的屬性。

具有int值的枚舉,如下所示:

public enum Format {
    HARD_COVER(1),
    PAPERBACK(2),
    E_BOOK(4),
    AUDIOBOOK(8);

    public final int value;

    Format(int value) {
        this.value = value;
    }
}

在您的Book class 添加一個名為formatint屬性而不是Format屬性。 還要創建一個名為isFormat的方法,該方法根據其Format參數返回boolean值:

class Book {
    private int format;

    public Book(int format) {
        this.format = format;
    }

    public boolean isFormat(Format format) {
        return format.value == (this.format & format.value); // &: bitwise and
    }
}

最后創建一本書,添加由 | 分隔的格式 (按位或):

Book book = new Book(Format.E_BOOK.value | Format.HARD_COVER.value | Format.AUDIOBOOK.value);

並像這樣檢查它的格式:

System.out.println("Is paperback?: " + book.isFormat(Format.PAPERBACK));
System.out.println("Is hard cover?: " + book.isFormat(Format.HARD_COVER));
System.out.println("Is audio book?: " + book.isFormat(Format.AUDIOBOOK));
System.out.println("Is E-book?: " + book.isFormat(Format.E_BOOK));

這個執行的結果是這樣的:

Is paperback?: false
Is hard cover?: true
Is audio book?: true
Is E-book?: true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM