2012-11-09 69 views
0

下面是我們公司中有人寫的類。避免使用覆蓋註釋編寫重複代碼

public class Reader1 extends PdsxAdapterBaseGemsReader { 

    @Override 
    public PdsxReader acquireReader(PdsxReadRequest pdsxReadRequest) { 
     return new PdsxUserReadOnlyGemsReader(pdsxReadRequest); 
    } 

    protected static class PdsxUserReadOnlyGemsReader extends PdsxAdapterBaseGemsReader.PdsxBaseGemsReader { 

      protected PdsxUserReadOnlyGemsReader(PdsxReadRequest pdsxReadRequest) { 
       super(pdsxReadRequest); 
      } 

      protected ClusterIdEnum getClusterId() { 
       return ClusterIdEnum.MARKEPLACE1; 
      } 

      @Override 
      public List<PdsxRecord> readData() { 
       List<UserCacheDoImpl> userDos = readUserCacheRecords(req, serverId,startLastModifiedDate, endLastModifiedDate); 
       // some code 
      } 


      private List<UserCacheDoImpl> readUserCacheRecords(PdsxReadRequest req, int serverId, Date startLastModifiedDate, Date endLastModifiedDate) { 
       List<UserCacheDoImpl> userDos = new ArrayList<UserCacheDoImpl>(); 
       BackEndIterator userIter = new BackEndIterator(getClusterId().getId(), serverId, startLastModifiedDate, endLastModifiedDate, READ_BATCH_SIZE); 
       //some code 
      } 


      private PdsxRecord createPdsxRecordFromUserDO(UserCacheDoImpl userCache) { 
       //some code 
      } 

      private void xValidateAttrKey(PdsxAttrKey readAttr) { 
       // some code 
      } 
    } 

} 

問題陳述: -

我需要編寫具有相同功能的另一個類的所有方法的名字,因爲它是。唯一不同的是這個方法 - 的

protected ClusterIdEnum getClusterId() { 
    return ClusterIdEnum.MARKEPLACE1; 
} 

它需要

protected ClusterIdEnum getClusterId() { 
    return ClusterIdEnum.MARKEPLACE2; 
} 

所以,如果我需要做的是在一個很老土的方式,我可以直接複製粘貼第一Reader類的一切並通過更改羣集ID方法來創建一個新的Reader2類。就這樣。但這不是一個好方法。

有誰能告訴我什麼是最好的方法來做同樣的事情,而不寫任何duplicate code很多次。

我被在基類中重寫getLcusterId() method想着這樣的事情,用代碼像這個 -

public class Reader2 extends Reader1 { 

    @Override 
    public PdsxReader acquireReader(PdsxReadRequest pdsxReadRequest) { 
     return new PdsxUserNewReadOnlyGemsReader(pdsxReadRequest); 
    } 

    protected static class PdsxUserNewReadOnlyGemsReader extends PdsxUserReadOnlyGemsReader { 

     protected PdsxUserNewReadOnlyGemsReader(PdsxReadRequest pdsxReadRequest) { 
      super(pdsxReadRequest); 
     } 

     @Override 
     protected ClusterIdEnum getClusterId() { 
      return ClusterIdEnum.MARKEPLACE2; 
     } 
    } 
} 

由於一切都在第一類相同的,所以我並不需要實現什麼在我的Reader2類中吧?這只是我可以覆蓋getClusterId() method

讓我知道如果我在這裏丟失任何東西。

+3

是的,你說得對。你只需要重寫'getClusterId()'方法,因爲這是唯一需要改變的功能。 –

+2

或者添加一個clusterId字段並在Reader對象被實例化時設置它?否則,感覺您需要爲ClusterIdEnum中的每個其他值創建一個新類 – Guillaume

+0

感謝Guillaume的建議。你能否給我提供一個關於我的代碼的例子,然後我會清楚地知道你剛纔所說的內容。 – AKIWEB

回答

0

如果它是可行的修改acquireReader方法的簽名,你可以將字段添加到您的閱讀器類:

public class Reader1 extends PdsxAdapterBaseGemsReader { 

@Override 
public PdsxReader acquireReader(PdsxReadRequest pdsxReadRequest, ClusterIdEnum clusterId) { 
    return new PdsxUserReadOnlyGemsReader(pdsxReadRequest, clusterId); 
} 

protected static class PdsxUserReadOnlyGemsReader extends PdsxAdapterBaseGemsReader.PdsxBaseGemsReader { 
     private ClusterIdEnum clusterId; 

     protected PdsxUserReadOnlyGemsReader(PdsxReadRequest pdsxReadRequest, ClusterIdEnum clusterId) { 
      super(pdsxReadRequest); 
      this.clusterId = clusterId; 
     } 

     protected ClusterIdEnum getClusterId() { 
      return clusterId; 
     } 

     //... 
} 

或者,也可以在Reader1構造函數到這一點,但它可以通過創建讀取器對象時的clusterId:

public class Reader1 extends PdsxAdapterBaseGemsReader { 
     private ClusterIdEnum clusterId; 

     public Reader1 (ClusterIdEnum clusterId) { 
      this.clusterId = clusterId; 
     } 

     @Override 
     public PdsxReader acquireReader(PdsxReadRequest pdsxReadRequest) { 
      return new PdsxUserReadOnlyGemsReader(pdsxReadRequest, clusterId); 
     } 

protected static class PdsxUserReadOnlyGemsReader extends PdsxAdapterBaseGemsReader.PdsxBaseGemsReader { 
     private ClusterIdEnum clusterId; 

     protected PdsxUserReadOnlyGemsReader(PdsxReadRequest pdsxReadRequest, ClusterIdEnum clusterId) { 
      super(pdsxReadRequest); 
      this.clusterId = clusterId; 
     } 

     protected ClusterIdEnum getClusterId() { 
      return clusterId; 
     } 

     //... 
} 
+0

感謝Guillaume的建議。現在對我有意義。看起來,我不能修改'acquireReader'方法的簽名,因爲它是'Interface'的一部分,而其他幾個類正在實現它,所以更改接口也會破壞其他代碼。因此,回到我發佈的第二個解決方案是通過重寫getClusterId方法的唯一方法嗎?Guillaume?如果我在那裏丟失任何東西,請告訴我。 – AKIWEB