1

UserCRUD 操作を行うための静的メソッドを追加する POJOがあるとします。

public class User {
    private String name;
    private int age;

    // getter and setter omitted
    //
    public static void add(User user) {
        // add person
    }

    public static int delete(Object id) {
        // delete person
        return 1;
    }
}

User のようなエンティティが他にもあるので、addanddeleteメソッドを次のように抽象化したいと思います。

public class?interface Entity<T>{
    static add(T t);
    static delete(Object id);   
}

public class User extends Entity<User>{
    @override
    static add(User user){
        // add ...
    }

    ....
}

これは可能ですか?

4

3 に答える 3

8

いいえ、できません。

まず、インターフェースで静的メソッドを定義することはできません。この議論を見る

static第二に、メソッドをオーバーライドすることはできません。このディスカッションを参照してください。

必要に応じて、インスタンスメソッドのままにして、各クラスが独自の実装を提供できるようにすることをお勧めします(ボヘミアンが提案したように)。

于 2012-10-08T00:36:59.937 に答える
2

エンティティ クラスでCRUDメソッドを静的にしないでください。代わりに汎用DAOインターフェイスを作成してから、エンティティ タイプごとに具体的な DAO クラスを実装してください。

このようなシナリオには静的メソッドを使用しないでください。より優れた OOP アプローチは、依存性注入フレームワークを使用することです。このフレームワークは、各具体的な DAO クラスのインスタンスを 1 つだけ作成してメモリと時間を節約し (新しい DAO インスタンスを何度も作成するため)、必要なアプリケーション内のすべての場所でそれらのインスタンスを再利用します。それらにアクセスします。

public interface Dao<T> {

    // you can customise these signatures by your needs
    // these are just my suggestions

    T get(long id);

    List<T> getAll();

    T add(T t);

    T update(T t);

    void delete(T t);
}

public class UserDao implements Dao<User> {

    public User get(long id) { ... }

    public List<User> getAll() { ... }

    public User add(User user) { ... }

    public User update(User user) { ... }

    public void delete(User user) { ... }
}
于 2012-10-08T00:47:22.613 に答える
1

静的メソッドをオーバーライドすることはできませんが、これらのメソッドを静的にする正当な理由はありません。それらをインスタンス メソッドにします。

インターフェイスは次のようになります。

public interface Entity<T> {
    T getId();
    void add();
    int delete();   
}

実装の場合:

public void add() {
    // add "this"
}

public int delete() {
    // delete "this"
    return 1;
}

このコード パターンは非常に一般的で、何度も見てきましたが、うまく機能します。


インスタンス メソッドを使用したくない場合は、ユーティリティ クラスに静的メソッドを作成して、そのようなオブジェクトを処理できます。

public class DaoUtil {

    public static <T> void add(Entity<T> entity) {
        // some impl
    }

    public static <T> int delete(Class<? extends Entity <T>> clazz, T id) {
        // some impl
    }
}
于 2012-10-08T00:39:45.140 に答える