[英]Avoid Writing Duplicates Code using Override annotations
下面是別人在我們公司寫的課。
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
很多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
。
讓我知道我是否在這里想念任何東西。
如果可以修改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構造函數中,但是可以在創建reader對象時傳遞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;
}
//...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.