扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
public class DBTable {                                                                         
       protected Connection conn;                                                                  
       protected tableName;                                                                        
       public DBTable(String tableName) {                                                          
           this.tableName = tableName;                                                             
           this.conn = ...;                                                                        
       }                                                                                           
       public void clear() {                                                                       
           PreparedStatement st = conn.prepareStatement("DELETE FROM "+tableName);                 
           try {                                                                                   
               st.executeUpdate();                                                                 
           }finally{                                                                               
               st.close();                                                                         
           }                                                                                       
       }                                                                                           
       public int getCount() {                                                                     
           PreparedStatement st = conn.prepareStatement("SELECT COUNT(*) FROM"+tableName); 
           try {                                                                                   
               ResultSet rs = st.executeQuery();                                                   
               rs.next();                                                                          
               return rs.getInt(1);                                                                
           }finally{                                                                               
               st.close();                                                                         
           }                                                                                       
       }                                                                                           
    }                               
    
    public class ParticipantsInDB extends DBTable {                                                
       public ParticipantsInDB() {                                                                 
           super("participants");                                                                  
       }                                                                                           
       public void addParticipant(Participant part) {                                              
           ...                                                                                     
       }                                                                                           
       public void deleteParticipant(String participantId) {
           setDeleteFlag(participantId, true);
       }                      
       public void restoreParticipant(String participantId) {
           setDeleteFlag(participantId, false);
       }                      
       private void setDeleteFlag(String participantId, boolean b) {
           ...                
       }                      
       public void reallyDelete() {
           PreparedStatement st = conn.prepareStatement(
                             "DELETE FROM "+
                             tableName+
                             " WHERE deleteFlag=true");
           try {              
               st.executeUpdate();
           }finally{          
               st.close();    
           }                  
       }                      
       public int countParticipants() {
           PreparedStatement st = conn.prepareStatement(
                             "SELECT COUNT(*) FROM "+
                             tableName+
                             " WHERE deleteFlag=false");
           try {              
               ResultSet rs = st.executeQuery();
               rs.next();     
               return rs.getInt(1);
           }finally{          
               st.close();    
           }                  
       }                      
    }                         ParticipantsInDB partsInDB = ...;
Participant kent = new Participant(...);
Participant paul = new Participant(...);
partsInDB.clear();
partsInDB.addParticipant(kent);
partsInDB.addParticipant(paul);
partsInDB.deleteParticipant(kent.getId());
System.out.println("There are "+partsInDB.getCount()+ "participants");
  最后一行代码,会打印出"There are 1 participants"这样信息,对不?错!它打印的是"There are 2 participants"!因为最后一行调用的是DBTable里面的这个方法getCount,而不是ParticipantsInDB的countParticipants。getCount一点都不知道删除标记这回事,它只是简单的计算记录数量,并不知道要计算那些真正有效的参会者(就是删除标记为false的)。
继承了一些不合适(或者没用的)的功能
  ParticipantsInDB继承了来自DBTable的方法,比如clear和getCount。对于ParticipantsInDB来讲,clear这个方法的确是有用的:清空所有的参会者。但getCount就造成了一点点小意外了:通过ParticipantsInDB调用getCount这个方法时,是取得participants这个表里面所有的记录,不管删除标记是true还是false的。而实际上,没人想知道这个数据。即使有人想知道,这个方法也不应该叫做getCount,因为这名字很容易就会跟“计算所有的(有效)参会者数量”联系在一起。
  因此,ParticipantsInDB是不是真的应该继承这个方法getCount呢?或者我们应该怎么做比较恰当呢?
它们之间是否真的有继承关系?
  当我们继承了一些我们不想要的东西,我们应该再三的想想:它们之间是不是真的有继承关系?ParticipantsInDB必须是一个DBTable吗?ParticipantsInDB希不希望别人知道它是一个DBTable?
  实际上,ParticipantsInDB描述的是系统中所有的参会者的集合,该系统可以是个单数据库的,也可以是多数据库的,也就是说,这个类可以代表一个数据库里的一个Participants表,也可以代表两个数据库各自的两个Participants表的总和。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。