4

私は静的メソッドをオーバーライドする必要があることに気づきました。それが最も理にかなっているという理由だけで、これが不可能であることもわかっています。

スーパークラス Entity.java:

abstract public class Entity<T> {
    public Entity() {
        //set up database connection
    }

    abstract public static Map<Object, T> getAll();

    abstract public void insert();

    abstract public void update();

    protected void getData(final String query) {
        //get data via database
    }

    protected void executeQuery(final String query) {
        //execute sql query on database
    }
}

多くの具体的な実装の 1 つ、Account.java:

public class Account extends Entity<Account> {
    private final static String ALL_QUERY = "SELECT * FROM accounts";
    private final static String INSERT_QUERY = "INSERT INTO accounts (username, password) VALUES(?, ?)";
    private final static String UPDATE_QUERY = "UPDATE accounts SET password=? WHERE username=?";

    private String username;
    private String password;

    public Account(final String username, final String password) {
        this.username = username;
        this.password =  password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(final String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(final String password) {
        this.password = password;
    }

    @Override
    public static Map<Object, Account> getAll() {
        //return a map using the ALL_QUERY string, calls getData(string);
    }

    @Override
    public void insert() {
        //insert this using INSERT_QUERY, calls executeQuery(string);
    }

    @Override
    public void update() {
        //update this using UPDATE_QUERY, calls executeQuery(string);
    }
}

コードについては詳しく説明していませんが、一般的なフィードバックもお待ちしています。コメントで十分に説明していただければ幸いです。

したがって、基本的には、使用Account.getAll()する方がより理にかなっていることに、私たちは皆同意できると思いますnew Account().getAll()(ダミーの構文を導入する場合)。ただし、クラスを拡張したいのですがEntity、現在は利便性のためだけですが、後でセット/リスト/マルチセットを使用して、それらすべてに対してアクションEntityを実行する必要があるupdate()場合があります。たとえば、キュ​​ーを構築する場合などです。パフォーマンスはすべて毎分更新されます。

getAll()さて、正しく構築する方法はありますか?

よろしく。

4

2 に答える 2

1

すべての要素の操作に個別のクラスを使用できます。

abstract public class Collection<T extends Entity<T>> {
    abstract public static List<T> getAll();
    public void printAll() {
        // Print all entries of List obtained from getAll()
    }
}

次のように使用できます。

public class Accounts extends Collection<Account> {
    @Override
    public List<Account> getAll() {
        //return a list using the ALL_QUERY string, calls getData(string);
    }
}
于 2013-05-13T20:01:47.640 に答える
1

それが本当に「単に最も理にかなっているから」であるとは思えません。

エンティティに永続性を結び付けることはお勧めできません。この問題を適切に設計するパターンはすでにたくさんあります。

たとえば、ドメイン駆動設計では、人々が達成しようとしているのは「持続性の無視」です。エンティティごとにリポジトリを作成することを検討してください。

interface Repository<T> {
    List<T> findAll();
    void insert(T);
    void update(T);
}

そのため、好きな方法でオーバーライドできます。

interface UserRepository extends Repository<User> {
    // some other methods which is meaningful for User
    User findByLoginName(String loginName);
}


class UserRepositoryImpl implements UserRepository {
    List<User> findAll() {
         // call whatever query
    }
    void insert(T){...}
    void update(T){...}
    User findByLoginName(String loginName) {...}
}

適切な設計とエンティティの取得/保存を処理するコンポーネントを使用すると、永続性の低いエンティティと、適切な「オーバーライド」を実行できるリポジトリを使用できます。

于 2013-05-14T01:55:06.270 に答える