[英]Avoid Writing Duplicates Code using Override annotations
Below is the class somebody else wrote in our company. 下面是别人在我们公司写的课。
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
}
}
}
Problem Statement:- 问题陈述:-
I need to write another class with the same functionality with all the method names as it is. 我需要编写另一个具有相同功能且具有所有方法名称的类。 The only difference is of this method-
唯一的区别是此方法-
protected ClusterIdEnum getClusterId() {
return ClusterIdEnum.MARKEPLACE1;
}
It needs to be 它必须是
protected ClusterIdEnum getClusterId() {
return ClusterIdEnum.MARKEPLACE2;
}
So if I need to do it in a very old fashioned way I can just copy paste everything from the first Reader class and make a new Reader2 class by changing the cluster id method. 因此,如果我需要以一种非常老式的方式进行操作,则只需复制粘贴第一个Reader类中的所有内容,然后通过更改集群id方法来创建一个新的Reader2类。 That's all.
就这样。 But that's not a good way.
但这不是一个好方法。
Can anyone tell me what's the best way to do the same thing without writing any duplicate code
lot of times.? 谁能告诉我做很多事情而不
duplicate code
很多duplicate code
的最好方法是什么?
I was thinking of something like this by Overriding the getLcusterId() method
in the Base Class, with code something like this- 我正在通过在基类中重写
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;
}
}
}
As everything is same in the first class so I don't need to implement anything in my Reader2 class right? 由于第一类中的所有内容都相同,因此我不需要在Reader2类中实现任何功能,对吗? It's just that I can override the
getClusterId() method
. 只是我可以重写
getClusterId() method
。
Let me know if I am missing anything here. 让我知道我是否在这里想念任何东西。
If it's doable to modify the signature of the acquireReader
method, you might add a field to your reader class: 如果可以修改
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;
}
//...
}
Alternatively, you can add this in the Reader1 constructor, but it you can pass the clusterId when creating the reader object: 或者,可以将其添加到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.