有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java避免使用重写注释编写重复的代码

下面是别人在我们公司写的课

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类中的所有内容,并通过更改cluster id方法来创建一个新的Reader2类。这就是全部。但这不是一个好办法

有谁能告诉我,做同样的事情最好的方法是什么而不用写很多次

我是这样想的,用类似这样的代码重写基类中的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

如果我遗漏了什么,请告诉我


共 (1) 个答案

  1. # 1 楼答案

    如果可以修改acquireReader方法的签名,您可以向reader类添加一个字段:

    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;
           }
    
           //...
    }