2017-06-24 1 views
0

特定のプロパティを持つ3つの特定のチケットタイプを必要とするプロジェクトで作業しています。Javaでは、getterとsettersをパラメータ化して使用することができます。つまり、コードを渡して返すクラス変数を決定することができます。

これらのプロパティの中には最終的なものと静的なものがありますが、変更する必要はありませんが、さらにタイプする必要があります。これは、抽象クラスへの変更を意味するが、それを実装するクラスへの変更を意味しない。クラスに書き込む必要のあるロジックを制限するために、これらのクラス変数を含む抽象クラスを作成しました。私はパラメータ(チケット型コード)を受け取ったgetterメソッドを書いてからメソッドがコードを切り替え、適切な値を返します。セッターメソッドでは、コードパラメータを受け取り、受け取ったコードに応じてクラス変数を更新します。

私の質問は以下のとおりです。この悪い習慣1.Is

私は私のクラスの設計を見直す必要がありそうか? 2.もしそうなら、私はコードを再利用可能かつパラメータ駆動型にする方法で、どのように問題にアプローチすべきですか?

以前は、コードファイルを変更する代わりにパラメータファイルを変更できるようにxmlまたはパラメータファイルを作成していましたが、Javaで数年間コーディングしていませんでした。ここで

は、コードスニペットです:。

private static final int iPickThreeLimit = 50; 
private static final int iPickFourLimit = 40; 
private static final int iPickFiveLimit = 60; 

private static int iPickThreeCount = 50; 
private static int iPickFourCount = 40; 
private static int iPickFiveCount = 60; 

protected static void setTicketCount(String sTicketType) { 

    switch (sTicketType) { 
    case "PickThree": 
     AbstractLotteryMachine.iPickThreeCount = iPickThreeCount--; 
     break; 
    case "PickFour": 
     AbstractLotteryMachine.iPickFourCount = iPickFourCount--; 
     break; 
    case "PickFive": 
     AbstractLotteryMachine.iPickFiveCount = iPickFiveCount--; 
     break; 
    } //end switch 
} // end setTicketCount 

protected static int getPickLimit(String sTicketType) { 
    int iTicketLimit = 0; 

    switch (sTicketType) { 
    case "PickThree": 
     iTicketLimit = iPickThreeLimit; 
     break; 
    case "PickFour": 
     iTicketLimit = iPickFourLimit; 
     break; 
    case "PickFive": 
     iTicketLimit = iPickFiveLimit; 
     break; 
    } //end switch 
    return iTicketLimit; 

    } //end getPickLimit 

私は各チケットタイプに対して個別のgetterメソッドとsetterメソッドを記述する必要がある場合、これは私は、この抽象クラスを実装していたクラスに必要なロジックを風船

+0

なぜ、それぞれのタイプの静的ファクトリメソッドを持つ不変クラスを使用しないのですか? –

+0

このようなスイッチは、ほとんどの場合、悪い考えです。多相性を使用して、それぞれの特定のサブクラスが何が起こるべきかを決めるようにします。したがって、基本クラスで型に基づく切り替えを行う代わりに、メソッドをオーバーライドします。 – GhostCat

+0

@GhostCatこの場合、署名が同一であるため、オーバーライドメソッドは機能しません。 –

答えて

1

私はenum変数を調べることをお勧めします。それらは静的として動作し、値を含むことができます。

public enum Pick 
{ 
    PickThree(30), 
    PickFour(40), 
    PickFive(50); 

    private int limit; 

    private Pick(int i) { limit = i; } 

    public int getLimit() { return limit; } 
} 

今、あなたの他のクラス(複数可)は、これらのいずれかを保持し、番号を取得するには、その変数/クラスのgetLimit()メソッドを使用することができますPick型の変数を持つことができます。列挙型には他のロジックも含めることができます。これはあなたの質問にあるものだけをカバーします。

+1

これは本当に単なるコメントです。 – GhostCat

+0

それでも私は私が望む限界を渡す必要がありますか?私はコードに基づいて任意の値を得ることができるようにする必要があるので、各タイプのハードコードされたロジックを書く必要はありません。また、これは、減算する必要があるクラス変数に対応していません。 –

+0

「制限を超えている」唯一の場所は、特定の列挙型のコンストラクタです。これは、あなたが制限を設定している "private static int"ステートメントと同等です。あなたはあなたが望む限界を渡すことはありません(getLimitにはパラメータがありません)。私はこれが「チケットの種類」だと思った。 "Pick"変数を正しいタイプ、たとえば "pickType"という変数に設定したら、 "pickType.getLimit()"を使用してハードコードされた番号を取得できます。その番号をどこかの場所に保存して、何らかの条件や他の条件の下で減らすことができる場合、私はそれを他の場所で扱うことが期待されます。 – arcy

0

私は不変のアプローチはもっときれいだと思います。

public final class Ticket { 

    private final int pickCount; 
    private int pickThreeLimit=50; 

    private Ticket(int count, int limit){ 
     this.count = count; 
     this.limit = limit 
    } 

    pubic int getTicketLimit(){ 
     return this.pickThreeLimit; 
    } 

    public in getTicketCount(){ 
     return this.count; 
    } 

    //add more static methods for each ticket type 
    public static Ticket createPickThree(){ 
    this.pickThreeLimit--; 
    return new Ticket(50,pickThreeLimit); 
    } 
} 
関連する問題