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. 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.?
I was thinking of something like this by Overriding the getLcusterId() method
in the Base Class, with code something like this-
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? It's just that I can override the 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:
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:
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;
}
//...
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.