下面是我們公司中有人寫的類。避免使用覆蓋註釋編寫重複代碼
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
。
讓我知道如果我在這裏丟失任何東西。
是的,你說得對。你只需要重寫'getClusterId()'方法,因爲這是唯一需要改變的功能。 –
或者添加一個clusterId字段並在Reader對象被實例化時設置它?否則,感覺您需要爲ClusterIdEnum中的每個其他值創建一個新類 – Guillaume
感謝Guillaume的建議。你能否給我提供一個關於我的代碼的例子,然後我會清楚地知道你剛纔所說的內容。 – AKIWEB