2016-05-21 8 views
1

私はコーディングのインタビューの本を割れ有名なを読んでいると私は、この問題とOOD(オブジェクト指向設計)についての章では、今だ:カードの一般的なデッキを設計するシングルトンクラスですか?

は、カードの一般的なデッキのためのデータ構造を設計します。ブラックジャックを実装するためにデータ構造をどのようにサブクラス化するかを説明します。私はここで私がうまく理解していなかったコードをお見せしたい

public enum Suit { 
    Club (0), 
    Diamond (1), 
    Heart (2), 
    Spade (3); 

    private int value; 
    private Suit(int v) { 
    value = v; 
    } 

    public int getValue() { 
    return value; 
    } 

    public static Suit getSuitFromValue(int value) { 
    switch (value) { 
    case 0: 
     return Suit.Club; 
    case 1: 
     return Suit.Diamond; 
    case 2: 
     return Suit.Heart; 
    case 3: 
     return Suit.Spade; 
    default: 
      return null; 
    } 
    } 
    } 

を私はデザインパターンを知っている発見していると私はコードでそれらを認識するためにいくつかの困難に会いました。しかし、この例のようなプライベートコンストラクタを見ると、絶対には、このクラスの一意のインスタンスを持つようにシングルトンパターンを実装したいという意味ですか?私が論理的に見つけたのは、あるデッキでは、それぞれのタイプ(ダイヤモンド、ハートなど)が1つしかないからです。

  • 値のみがプライベートint型やプライベートではありません静的である理由:場合

    ので、(コンストラクタがプライベートで別の例がある場合、私は知らない)、このクラスはシングルトンですint ??

  • なぜそのクラスに "new"演算子がないのですか?私たちは少なくともそれを使うことができないようにスイートを設置すべきですか?だから、私たちは次のようなものを持っているはずです:新しいスーツを返します。もし、シングルトンクラスがスレッドセーフでないなら、それは大きな問題だと思いますか?(聞いてください= null)
  • 私たちは同時に2つのスレッドへのアクセスを扱うために何かをしなければならないからです。確かなインスタンス化や、揮発性のキーワードによる二重チェックロックや、最初のインスタンス化のためだけに同期化されているようなもの...そうするための技術はたくさんありますが、何もしなければ、OODとパフォーマンス、いいえ?

あなたは

+0

なぜシングルトンがカードのデッキに適していると思いますか?私は確かに世界にカードのデッキが2つ以上あると確信しています... –

+0

あなたがもっと見ると、これは実際にenumでありクラスではありませんが、これはあなたのための謎の大部分を解決するはずです列挙型であり、それがシングルトンでないためにプライベートコンストラクタを持つことを意味します。同じ理由でコンストラクタが 'new'キーワードなしで呼び出され、値が異なる4つの異なる列挙型定数 – illgoforit

答えて

1

列挙型は、Javaのクラスとは異なる、私はより良いこれらの点を理解するのに役立つことができればお願いします。クラスよりも制限の厳しい特別な用途があります。

コンストラクタがEnumでプライベートであるのは、インスタンスに関連付けられた値が事前定義されているためです。列挙型は、たとえば曜日のような定数の固定セットを表す必要がある場合などに便利です。コンパイル時に値を定義し、名前(MONDAY、TUESDAYなど)で値を参照するだけです。

コンストラクターが公開されている場合、コードを使用している誰かが実行時に独自のSuitを作成する可能性があります。それは確かにBlackjackの標準ルールを破り、誰かにエラーを引き起こすでしょう。

コンパイル時にスーツに値を割り当てると、コンパイル時のチェックが増加し、無効な定数が渡されるエラーを回避し、許容される値も記録されます。

この例の静的メソッドは、整数を対応するSuitに変換する便利なユーティリティですが、列挙型の要件ではありません。

上記のクラスはスレッドセーフであり、EnumがJVMによって「クラスロード」されても初期化されるため、スレッドセーフですが、スレッドセーフではないEnumでメソッドを作成することができます。

関連する問題