簡體   English   中英

Java枚舉最佳實踐

[英]Java enum best practice

這可能看起來像一個微不足道的問題,但我對於枚舉的想法有點混亂。

所以我有一個類 - 讓我們說它叫做DVDPlayer - 我希望有一個枚舉來表示它是ON,OFF還是STANDBY。

所以我可以將enum放在課堂上 - 它在課堂之外沒有意義。 我的問題是 - 如果枚舉是公開的,那么其他類可以查詢值,或者我應該將其設為私有,然后使用“isOn”,“isOFf”和“isStandby”方法?

后者聽起來有些愚蠢,但我不確定將枚舉作為公共場所也是一個好主意。

我想說將它公之於眾似乎是一個好主意。 主要原因是應用程序更容易擴展,因為每次添加狀態時都不必考慮添加新方法。

如果您決定將其公開,則應考慮將其作為頂級枚舉。 我真的不明白為什么你說“它在課堂之外沒有意義” 我認為DVDPlayerState聽起來像一個完美的公共/頂級枚舉。

這取決於您想如何使用外部世界的DVDPlayer類:

if (dvdPlayer.getState() == State.ON)

要么

if (dvdPlayer.isOn())

我認為第一個是更好的選擇。 您不必使用委派方法污染代碼。

根據經驗,你希望盡可能保持私密(雖然通常情況下,這不是枚舉的用例),但從問題提出的方式來看,我不確定你是否按預期使用枚舉。

您想使用枚舉來表示固定值; 將這些值保存為靜態最終整數或字符串是更清潔的替代方法。 因此對於聲明為枚舉的枚舉

public enum DvdState { ON, OFF, STANDBY };

你的課看起來有點像這樣:

public class DvdPlayer {
    private DvdState state = DvdState.OFF;

    public void setState(DvdState state) {
        this.state = state;
    }
}

調用類將使用以下代碼:

dvdPlayer.setState(DvdState.ON);

如果enum是公共接口的一部分,那么將它聲明為公共是有意義的。 這似乎是DVPlayer的情況,因為你說它可以被查詢。 三種方法“ isOn ”,“ isOFf ”和“ isStandby ”不必要地膨脹公共接口。

但是有時候在課堂上使用enum會派上用場,在這種情況下它應該被聲明為私有 例如,以下聲明

private enum Format{DVD, BLURAY};

如果FormatDVDPlayer類內部使用但不是公共接口的一部分作為參數或方法的返回值,那也沒關系。

讓枚舉公開可能有意義。 然后你會有這樣的事情:

DvdPlayer.State getState();

如果您只有三個狀態,則最好使用isOn,isOff和isStandby方法。 對於更多的州,公共枚舉更好。 枚舉也可以在switch語句中使用,這很方便。

我想我會成為第一個提倡在這里使用方法的人。 首先,考慮一下你班級的用戶。 他們對您的業務領域了解得越少越好,所以不要將他們與“狀態”之類的東西混淆。 你不會在現實生活中“設置DVD播放器的狀態”,而只是“打開它”或“關閉時關閉”,這對我來說是尖叫的方法。 除了Java因為嚴格靜態類型而聞名和喜愛之外,它允許您僅通過IDE的自動完成建議來發現界面。 讀取方法turnOff對我來說很有意義,而setState是模糊的,並且要求我先查看狀態枚舉,以便讓我知道狀態實際上是什么。

暫無
暫無

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

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