简体   繁体   中英

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. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM