4

1つの考えがありましたが、これを実装する方法を理解できませんでした。

public class BaseDomain<T>{

//Generic methods goes here

}

public class Domain1 extends BaseDomain<Domain1>{

private int id;

private String name;

//only properties should be present here

}

public class Domain2 extends BaseDomain<Domain2>{

private int id;

private String name;

//only properties should be present here

}

上記のシナリオでは、基本クラスですべてのジェネリック メソッドを簡単に定義でき、ジェネリックを使用してすべてのドメイン クラスで使用できます。しかし、ここでの私の問題は、開発者がドメインクラスのプロパティのみを定義する必要があるメカニズムを設計したいことです(ゲッター/セッターなし)。

どんな提案でも大歓迎です!

4

5 に答える 5

2

Javaの通常の機能ではできません。

Lombokのようなツールを使用できます。

個人的には、このアプローチは好きではありません。プロジェクトに「魔法」が導入されて、ある時点で問題が発生し、ボイラープレート コードが少ししか節約されないからです。

于 2013-05-10T12:55:00.710 に答える
2

リフレクションを使用すると、それが可能になります。

public class BaseDomain<T>{


    public String getName() {
        return this.getClass().getField("name").get(this);
    }

    public void setName(String value) {
        this.getClass().getField("name").set(this, value);
    }

}

たとえば、そのオブジェクトのランタイム クラスthis.getClass()を参照することに注意してください。したがって、そこにあるフィールドにアクセスしたり、値を取得/設定したりできます。Domain1

privateプロパティをまたはに宣言する場合は、アクセス権限を設定する必要がある場合がありますprotected。彼らがpublicそうなら、それはうまくいくはずです。

OPが述べたように、使用してgetDeclaredFields()もパブリックフィールドを宣言する必要はありません。残念ながら、特定の名前でMapにアクセスするには、繰り返し処理する(または a を使用する)必要があります。Field

フィールドがオブジェクト インスタンスに存在しない場合、例外が発生します。

于 2013-05-10T13:04:28.087 に答える
0

これは、インターフェイスを使用する必要があるように思えます。インターフェイスを使用して、提供する必要がある関数を定義し、それを実装するクラスでそれらを提供する必要があります。あなたのコードでは、クラスと同じように、特定のクラスをインターフェイスだけで参照することはありません。

例:

public interface MyInterface
{
     public String getName();
}

public MyClass implements MyInterface
{
    public String getName { return " test"; }
}

public OtherClass
{
    private MyInterface = new MyClass();
}

プログラマーにインターフェースを実装させたくない場合は、リフレクションを介してのみ行うことができます。ここで説明するように、getter と setter を実装し、このオブジェクトを介してアクセスするプロキシ オブジェクトを使用できます: Java クラスは追加できますか?実行時にそれ自体へのメソッド?

于 2013-05-10T12:55:10.010 に答える
0

基本クラスで定義されたすべての変数、getter、および setter は、アクセス レベル修飾子で使用が許可されている場合、基本クラスを拡張するクラスで使用できます。

次に例を示します。

public class BaseClass {

    private int id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

class AnotherClass extends BaseClass {

    public String getIdString() {
        return Integer.toString(getId());
    }
}

id は基本クラスでプライベートとして定義されているため、拡張クラスが ID を取得できる唯一の方法は、パブリックの getId メソッドを使用することです。getId および setId メソッドを使用する。拡張クラスは Id フィールドを定義せずに使用できます。

拡張クラスがフィールド自体にアクセスできるようにするには、フィールドをプライベートではなく保護する必要があります。

拡張クラスは、それ自体が必要とするゲッターとセッターを定義するだけで済みます。基本クラスで既に定義されている getter と setter を使用できますが、これもアクセス レベル修飾子で使用が許可されていることを前提としています。

于 2013-05-10T14:02:32.213 に答える
0

コードにある種のプリプロセッサがなければ、それを行うことはできません。プリプロセッサは、Java ファイルをコンパイルする前に解析し、必要なメソッドを追加してから、前処理された結果のファイルをコンパイラにプッシュします。とにかく、Java が静的に型付けされた言語であることを考えると、これは非常に悪い考えです。

動的にしたい場合は、Java の代わりにGroovyを使用できます。Groovy は、Java と多くの部分を共有し、JVM バイトコードにコンパイルする別の言語です。ただし、この種の「動的」メソッドを非常に簡単に作成できます。

于 2013-05-10T12:56:23.077 に答える