我发现自己需要覆盖静态方法,只是因为它最有意义,但我也知道这是不可能的。
超类,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
}
}
许多具体实现之一,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()
?
问候。
答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
在我看来,它确实“仅仅是因为它最有意义”。
将持久性与实体联系起来并不是一个好主意。已经有很多模式可以解决这个问题。
例如,在Domain Driven Design中,“Persistence Ignorance”是人们试图实现的目标。考虑为您的每个实体创建一个存储库:
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) {...}
}
通过适当的设计和处理实体检索/存储的组件,您可以拥有一个持久性较低的实体,并且可以使用可以执行正确“覆盖”的存储库。