2012-02-19 11 views
2

動的なプロパティの数を持つ汎用クラスを持つ方法を探しています。動的なパラメータ番号を持つ汎用クラス

例:(クラスユーザー)

User user1 = new User(1,"john","115 street","male",60,150, 15.125); 
User user2 = new User(2,"john2","116 street","male",60,150, 15.125,"New york"); 

など。

は、このJavaで行うことができますまたはあなたは私のすべての可能な選択肢(ない場合)をお勧めだろうか?

+1

Javaは、Javaなどの強力な言語で頭文字 – Robert

+0

ではありません、あなたはダイナミック型を作成することはできませんコンパイル時に指定されているすべてのタイプのため。あなたの要求は、PythonやRubyなどの動的言語で解決さ​​れました。 – MJM

答えて

4

残念ながら、Javaは動的プロパティをサポートしていません。

あなたはそれをハックすることができます

  1. 可変引数メソッド。次の署名method(Object... objects)を使用してください。 その場合は、パラメータのオブジェクトの配列をメソッドに渡します。必要に応じて処理します。

  2. マップ構造。私はその良いソリューションだと思う、あなたのクラス内のパラメータでマップしている。 whereはあなたのパラメータのkey - nameで、実際の値はvalueです。

    class User {  
    
    Map<String, Object> properties; 
    
         Object getParameter(String key){ 
         return properties.get(key); 
         } 
         void addParameter(String key, Object value){ 
         properties.put(key, value); 
         } 
    
    } 
    

あなたのオブジェクトに新しいパラメータを追加するために使用する方法addParameter。(例えばgetParameter("name");)

使用方法getParameterが必要な値を抽出するために

+0

「通常の」静的プロパティ(名前、住所など)をマップに置き換えてはなりません。型の安全性、エディタのサポート、スペルチェック/コンパイラのサポート( 'getParameter(" nam ")'が有効)、Java Beansのサポート。特に後者の場合、これに依存するすべてのツール(例えば、Hibernateなど)は失敗するか、余分な作業が必要になります。真にダイナミックなパラメータにのみマップを使用してください。 –

+0

属性がオプションであっても、Mapを使用するべきではありません(Builderパターンを使用する方がよい) – mishadoff

6

varargs constructorはJavaで作成できます。あなたのケースでは、次のようになります。

public class User { 
    private final long id; 
    private final String name; 
    private final Object[] parameters; 

    public User(long id, String name, Object... parameters) { 
    this.id = id; 
    this.name = name; 
    this.parameters = parameters; 
    } 
} 

私はそれが良いパターンではないと思う、と私は例オプションのパラメータ、またはのようなものを含むMap<String, Object>ために、良いアイデアを思い付くためにあなたをお勧めしますが、それ。

1

Builderパターンを使用する方がよいでしょう(私の意見では)あなたの場合Builder pattern

2

の候補です。 hereを参照してください。または、効果的なJavaのBlochの項目2を参照してください。

2

はい、可能ですが、多分それは良い考えではありません。

あなたが行うことができます。

User(Object... args) { 
    Object someObject = args[0]; // Check for length! 
} 

これは、Javaの用語でvarargsと呼ばれています。しかし、あなたはすべてあなたの議論をObject[]の中の簡単なObjectとして得て、それを解釈する方法を見つけなければなりません。呼び出し元は、どのパラメータをどの位置に置くべきかわかりません。これを許可したいのであれば、通常、Javaの型とバインディングシステムでは言語を使用しません。

「Javaのやり方」は、メソッドをオーバーロードすることです。与えられた名前とタイプの異なる引数を持つ複数のメソッドを持つことができます。例:

User(long id, String name) { ... } 
User(long id, String name, String address) { ... } 
// and so on 

これは面倒なことがあるので、IDEには少なくともコンストラクタ用にこれらを生成するツールがあります。

関連する問題