2017-02-07 8 views
1

私はこのクラスを持っています: package util;メソッドに定数を渡すには?

public final class Constant { 

    private Constant() { 
     throw new AssertionError(); 
    } 

    public static class Product { 
     public static final String CODE = "Product"; 
     public static final String A = "product_5g2g"; 
     public static final String B = "product_a45h"; 
     public static final String C = "product_a3ag"; 
     //more constants.. 
    } 

    public static class Employee { 
     public static final String CODE = "Employee"; 
     public static final String A = "employee_1g3f"; 
     public static final String B = "employee_h52d"; 
     public static final String C = "employee_h5d2"; 
     //more constants.. 
    } 

    public static class Client { 
     public static final String CODE = "Client"; 
     public static final String A = "client_h5ad"; 
     public static final String B = "client_1df1"; 
     public static final String C = "client_6g23"; 
     //more constants.. 
    } 
} 

と:

package util; 

import util.Constant.*; 

public class Main { 

    public void run() { 
     if (isSelected(Product.CODE)) { 
      if (isSelected(Product.A) || isSelected(Product.B)) { 
       //do something 
      } 
      compute(Product.C); 
      //more similar instruction that use constants from Product class 
     } 
     if (isSelected(Employee.CODE)) { 
      if (isSelected(Employee.A) || isSelected(Employee.B)) { 
       //do something 
      } 
      compute(Employee.C); 
      //more similar instruction that use constants from Employee class 
     } 
     if (isSelected(Client.CODE)) { 
      if (isSelected(Client.A) || isSelected(Client.B)) { 
       //do something 
      } 
      compute(Client.C); 
      //more similar instruction that use constants from Client class 
     } 
    } 

    public boolean isSelected(String s) { 
     return true; 
    } 

    public void compute(String s) { 

    } 
} 

あなたが見ることができるようにJavaがないので、コード

if (isSelected(StaticClass.CODE)) { 
    if (isSelected(StaticClass.A) || isSelected(StaticClass.B)) { 
     //do something 
    } 
    compute(StaticClass.C); 
    //more similar instruction that use constants from Product class 
} 

のこのブロックが反復的であるが、別の方法でそれを置くことはできません静的クラスをパラメータpublic void method(StaticClass) {}として許可します。

上記のコードをどのようにリファクタリングすることができますか?私の最初の考えは、基本クラスを拡張するシングルトンを作ること、または共通のインターフェースを実装することでした。より良い解決策がありますか?

+1

Enumsにチェックを入れましたか? – mc20

+1

私は列挙型を思い出し、スイッチケースと抽出メソッドについて考えていきます。 – Nico

+0

@ジョージ質問に2つの回答があります。それ以上の説明が必要な場合は、コメントに記入してください。投票は無料です。答えを受け入れることで2点が得られます。あなたは失うものは何もありません。あなたがコメントをしたり、回答を受け入れるのを止めてしまうような心配があれば教えてください。 – CKing

答えて

1

あなたが探しているのはEnumです。代わりにすべてのクラスをEnumと再定義してください。たとえば、次のようにProductクラスをredfineことができます。

public enum Product { 
    CODE("Product"), 
    A("product_5g2g"); 

    private String value; 
    //define others constants in a similar fasion 
    public Product(String value) { 
     this.value = value; 
    } 
} 

Enumsメソッドのパラメータとして渡すことができます。あなたの特定の例では、この操作を行うことができます言っ

public void method(Constants.Product product) { 

} 

は、あなたは間違いなくあなたの目的を達成するための別の方法を検討すべきです。まず、Replacing conditionals with Polymorphismをご覧ください。

1

多型をここで調べてください。例:

Y y = getMeSomeY(); 
y.doTheY(); 

getMeSomeY()戻りますが正確に何が必要であること(そうYはインターフェースである可能性があります。その方法は異なる提供:OOは次のようにはるかに見える代わりに

if (X) { 
doY(); 
} 

を行うための「良いです」そのインターフェイスの実装はすべて少しずつ異なることを行います)。 要点:手続きコードを書きました。ここでと聞いて何かを決定してから決定してください。良好なオブジェクト指向は、反対側(tell don't askと呼ばれます)を優先します。

すべてのフラットストリングを作成しないで開始します。そうすることで、静的タイピングの全体をあきらめます。あなたのコードが文字列だけで意思決定をしているのなら、なぜJavaでプログラミングしていますか?あなたは非常によくタイプド言語以外の言語を使用することができます。だから、少なくともJava enumについて知ること。それらを使用してください。しかし、理解してください:列挙型は答えていません。彼らはちょうどあなたのコードを少し良くするのに役立ちます。

実際ここで問題は、これらのコードをif (x) then yに書き込むことです。

あなたは今のところ推測しているかもしれませんが、簡単な答えはここにありません。私がやること:まず、一歩後退する。そしてあなたのデザインを詳しく見てみましょう。あなたが今持っているコードは、基になるオブジェクトモデルが「有用」から遠いことを私に示しています。そして、それはOOの全体のポイントです:助けあなたはきれいでエレガントなコードを書くことができるクラスとオブジェクトを作成します。しかし、あなたの基本設計がそれをサポートしていないとき。それから出てきたコードをリファクタリングしようとしても意味がありません。あなたのコードの醜さは単に症状に過ぎないので、根本的な原因はデザインの下にあります。

+0

'getMeSomeY()'を引数に指定する方が意味があります;) – CKing

関連する問題