0

switchこの質問は、優れたプログラミング プラクティスと設計上の決定に関するものですが、コンストラクター内を中心にしています。

アイデアは、さまざまな方法でデフォルトの動作を処理することです。デフォルトのコンストラクター ( Const()) は最も単純な、または最も一般的なケースを処理し、パラメーター化されたコンストラクター ( Const(int type)) はswitch他の特定のケースを列挙するために使用します。

いくつかのコードを保存するために、たとえばcase: 0でデフォルト コンストラクターを定義し、次のように基本コンストラクターからそれを参照することがConst() { this(0); }できます (コンパイラーは 1 つだけを要求するため、それ以外の方法では実行できませんでした (つまり、スイッチ ケースから基本コンストラクターを参照します)。最初のステートメントとして別のコンストラクターへの 1 つの参照)。

default:しかし、パラメータ化されたコンストラクターでケースを送信してcase: 0(「無効なケースです。代わりにデフォルトのケース (0) を使用しています。」などのエラー メッセージと組み合わせて)、またはその逆を送信して、誤った入力を処理できるようにしたいと考えています。 .

ここで他の質問を検索して読みました(たとえば、これあれを参照してください)。ある種のツイストスイッチフォールスルースキームでどこでそれを実行できるかを見ることができましたが、セマンティクスと明確さのために、私は維持したいと思います最初にデフォルトのケース、または一方で、コンストラクター (this.Const(default)またはソートなど) を介してデフォルトのステートメントを参照することは可能ですか? もしそうなら、この問題に対する哲学的に最善のアプローチは何ですか?

4

2 に答える 2

1

それぞれのケースを別々の方法で処理するのはどうですか?

次に、次のことができます。

case 0: handleCase0(); break;
default: complainThatThisShouldntHappen(); handleCase0(); break;

Enumスイッチに整数の代わりに anを使用している場合、コンパイラによる型の安全性チェックにより、デフォルトのケースが廃止されることに注意してください。

于 2012-11-27T07:50:49.580 に答える
0

質問はまだ学術的な目的のためのものですが、これが私がこの問題にどのように対処したかです. 型変数に基づいて switch ステートメントを使用してオブジェクトを作成するコンストラクターを作成する前に (おそらく、特定の Enum クラスで処理する方がよいでしょう)。私の場合はいずれも画像をロードしてオブジェクトに関連付けていたため、非常に面倒でした。私が今やったことははるかに簡単です:

// Default constructor for most common uses.
ClassName() {
    this(0);
}

// Parametrized constructor
ClassName(int type) {
    this.type = type;
}

画像は、GUI を使用するクラスを介してロードされます (したがって、役割が分離されます)。そのメソッドの 1 つは、オブジェクトのタイプに従ってインデックス付けされた画像の配列を返します。これは、 draw メソッドで使用されます。

public draw (Graphics page, BufferedImage[] backgrounds) {
    // Misc. calculations.
    page.draw(backgrounds[type], getX(), getY(), null);
}

したがって、はるかにエレガントなソリューションになります。

于 2012-11-29T20:17:20.153 に答える