3

1 つまたは複数のインターフェイスが与えられた場合、クラスの実装を生成する最良の方法は何ですか?

interface Vehicle
{
    Engine getEngine();
}

@Generated
class Car implements Vehicle
{
    private final Engine engine;

    public Car(Engine engine)
    {
        this.engine = engine;
    }

    public Engine getEngine()
    {
        return engine;
    }

    // generated implementation of equals, hashCode, toString, 
}

クラス変数は、インターフェイスの getter メソッドから派生する必要があります。理想的には、インターフェイスの共変の戻り値の型が処理されます。実装では、プライベート最終変数とコンストラクターのインスタンス化を使用して、不変性を優先する必要があります。equals、hashCode、および toString メソッドを生成する必要があります。

4

4 に答える 4

3

よりクリーンな方法は、CGLIBを使用して、実行時にクラスを動的に生成することです。明らかに、ソース ファイルを参照することはできません。

ソース ファイルが必要な場合は、codemodelを試して、次のようにすることができます。

JCodeModel cm = new JCodeModel();
x = cm._class("foo.bar.Car");
x.field(Engine.class, "engine");
for (PropertyDescriptor pd:    Introspector.
              getBeanInfo(Vehicle.class).getPropertyDescriptors()) {
    g = x.method(JMod.PUBLIC, cm.VOID, pd.getReaderMethod().getName()); 
    g.body()...
    s = x.method(JMod.PUBLIC, cm.VOID, "set" + pd.getName());
    s.body()...
}
hc = x.method(JMod.PUBLIC, cm.VOID, "hashCode"));
hc.body()...
cm.build(new File("target/generated-sources"));

または、以前に提案したように、IDE を使用します (Eclipse の場合: メニュー「ソース」、「hashcode() および equals() を生成する...」、つまり)

于 2009-04-14T13:28:45.707 に答える
1

大量の処理を行う場合は、javac (Java SE 1.5 では apt) に組み込まれている注釈プロセッサ機能を検討することをお勧めします。

于 2009-04-14T11:19:43.210 に答える
1

インターフェイスのクラスを実装するときは、Eclipse と同じように行います。

メソッドが get で始まる場合は、それを getter と見なし、メソッドを解析して変数名とその型を抽出します。これらのフィールドのコンストラクターも作成し、equals、hashcode、および toString メソッドも実装します。

通常のファイル解析を行うことができます。または、リフレクションも不明な点に役立つ可能性があります。

于 2009-04-14T08:12:56.153 に答える
0

ボイラープレートコーディングに役立つ最新のJava IDEを使用するだけでなく、動的プロキシを使用してチェックすることもできます

于 2009-04-14T09:30:04.987 に答える