2013-05-13 192 views
4

我发现自己需要重写一个静态方法,只是因为它最有意义,但我也知道这是不可能的。Java重写静态方法

超类,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

只需在静态方法中删除'@ Override',就可以了。另见:http://stackoverflow.com/q/548861/139010 – 2013-05-13 19:52:23

+0

谢谢你使用我的建议。不标记你使用的正确答案可能会引起其他人对你最初的问题的关注。 – christopher 2013-05-13 19:52:33

+0

@MattBall实施明智,确实很好。但我宁愿有一些更严格的限制,这就是我在界面中首先提到它的原因。 @ChrisCooney可能这有点滞后,因为我确实记得它是正确的,我希望我已经正确地使用了你的建议,尤其是使用泛型参数'Entity ' – skiwi 2013-05-13 19:55:26

回答

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); 
    } 
} 
+0

这不是一个集合,它是一个数据访问对象/服务。 (或者,下面的答案称之为知识库)。 Java或其他集合的用法,API和功能与_quite完全不同。 – 2013-05-14 02:12:52

+0

我刚刚称它为“集合”,因为缺乏更好的名称,不会干扰现有集合类的名称确实会更好。 – ValarDohaeris 2013-05-14 06:52:35

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) {...} 
} 

有了适当的设计和组件来处理实体的检索/存储,你可以有一个不太持久的耦合实体,并且可以执行正确的“覆盖”。

+0

我很喜欢命名的“Repository”(感谢Adrian!)。我为此答案+1,但总的来说,我会推荐使用_Hibernate_,而不是花2个人年编写一个持久层。皱纹和陷阱丰富,如果你尝试DIY这个.. – 2013-05-14 02:14:46

+0

@ThomasW你知道吗?很多人都在使用Hibernate来实现存储库:)并且,看看Spring Data - Hibernate,这使得创建Repository变得很轻松:) Hibernate很容易使用,但这并不意味着它可以很好地污染具有持久性逻辑的实体(使用Hibernate) – 2013-05-14 02:47:45