2010-08-27 70 views
9

這似乎是一個簡單的問題,但我在我的思維就枚舉有點糊塗..Java的枚舉的最佳實踐

所以我有一個類 - 讓我們說其所謂的DVD播放機 - 我想有表示它是ON,OFF或STANDBY的枚舉。

所以我可以把這個枚舉放在類中 - 它在類之外沒有任何意義。我的問題是 - 如果枚舉是公開的,以便其他類可以查詢值,或者我應該使它私有,然後有「isOn」,「isOFf」和「isStandby」方法?

後者聽起來有點愚蠢,但我不確定將enum公開爲好是不是一個好主意。

回答

8

我會說這似乎是一個好主意,使其公開。主要原因是應用程序更容易擴展,因爲每次添加狀態時都不必考慮添加新方法。

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

+0

我只是認爲,除了DVDPlayer之外,國家不應該擁有它自己的生活 - 它只對DVDPlayer有意義。 – pecks 2010-08-27 08:33:26

+6

在同一時間,它可能。您可能有一個DvdPlayerRemoteControl,它對DvdPlayer可以具有的狀態非常感興趣。 – mikek 2010-08-27 08:37:20

+0

是真的。我已經將oder中的示例更改爲在此發佈,所以我可能沒有想到它通過那麼多! – pecks 2010-08-27 08:40:11

2

這取決於你想如何使用來自外界DVDPlayer類:

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

if (dvdPlayer.isOn()) 

我第一個想到的是一個更好的選擇。您不必使用委託方法污染代碼。

+0

你是對的,這正是它所要涉及的。 – pecks 2010-08-27 08:34:09

+1

其實我更喜歡後者,因爲isOn()的讀取速度要快於圍繞可能由狀態表示的東西,因此您首先需要查看枚舉。 – 2016-04-19 15:27:46

0

使枚舉公開可能是有道理的。這樣,你會是這樣的:

DvdPlayer.State getState(); 

如果你只有三種狀態,它可能是最好使用ISON,ISOFF和isStandby方法。對於更多的州來說,公共枚舉更好。另外一個枚舉可以用在switch語句中,這很方便。

2

作爲一個經驗法則,您希望儘可能保密(雖然通常情況下,這不是enums的用例),但從您提出的問題的方式來看,我不確定您是否使用枚舉如預期。

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

public enum DvdState { ON, OFF, STANDBY }; 

枚舉您的類看起來有點像這樣:

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

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

以及呼叫類將使用下面的代碼:如果enum

dvdPlayer.setState(DvdState.ON); 
+0

這種思維方式很像過度工程。我想打開或關閉播放器。沒有人會說她想改變或設置球員的狀態...... – 2016-04-19 15:30:21

0

公共界面的一部分,聲明它是有意義的public。這似乎是DVPlayer,因爲你說它可以被查詢。「isOn」,「is」「」和「isStandby」這三種方法「不必要地膨脹公共接口。

但有時當enum派上用場的類中使用,在這種情況下,它應該被宣佈私人。例如,以下聲明

private enum Format{DVD, BLURAY}; 

將是好的,如果格式是內部使用的DVD播放機類,但並不公共接口或者作爲方法的一個參數或返回值的一部分。

0

我想我會是第一個主張在這裏使用方法的人。首先,考慮你的班級的用戶。他們需要了解的業務領域越少越好,因此不要將它們與「狀態」等事物混淆。在現實生活中,你不會「設置DVD播放器的狀態」,而只是「打開它」或「如果關閉」,這對我來說就是尖叫方法。除了Java被嚴格地靜態類型知道和喜愛之外,它允許您僅通過IDE的自動完成建議來發現接口。讀一個方法turnOff對我來說很有意義,而一個setState是不明確的,並且需要我先查找狀態枚舉,以便知道狀態究竟是什麼狀態。