[英]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.