Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何设计一个类,该类需要来自其子类的多个属性来处理一个文件?_Java_Csv_Oop_Design Patterns - Fatal编程技术网

Java:如何设计一个类,该类需要来自其子类的多个属性来处理一个文件?

Java:如何设计一个类,该类需要来自其子类的多个属性来处理一个文件?,java,csv,oop,design-patterns,Java,Csv,Oop,Design Patterns,我有如下要求: 从CSV文件读取数据。 根据传递的密钥查找重复行。(例如,CSV文件有10列,我们需要根据特定行查找重复项。) 钥匙) 拒绝/接受重复行的布尔值 单元处理器来验证文件中的每一行 这是一个批量上传数据,我逐行读取文件,根据传递的键查找该行是否有有效数据,该行是否不重复,最后返回一个有效行列表 abstract class BulkUploadService { List<BulkDTO> process(File file) { // Read

我有如下要求:

  • 从CSV文件读取数据。
  • 根据传递的密钥查找重复行。(例如,CSV文件有10列,我们需要根据特定行查找重复项。) 钥匙)
  • 拒绝/接受重复行的布尔值
  • 单元处理器来验证文件中的每一行
  • 这是一个批量上传数据,我逐行读取文件,根据传递的键查找该行是否有有效数据,该行是否不重复,最后返回一个有效行列表

    abstract class BulkUploadService {
         List<BulkDTO> process(File file) {
           // Read a file and the value from below methods overridden by their child classes
         }
    
         abstract CellProcessors[] cellProcessors();
         abstract boolean isDuplicatesAllowed();
         abstract String[] headers();
         abstract String rowKey();
     }
    
    抽象类BulkUploadService{
    列表进程(文件){
    //从下面的方法中读取文件和值,这些方法由其子类重写
    }
    抽象单元处理器[]单元处理器();
    抽象布尔isDuplicatesAllowed();
    抽象字符串[]头();
    抽象字符串rowKey();
    }
    
    process()方法需要-文件、行键、CellProcessors、boolean来接受/拒绝重复项,以及其他一些来处理和返回DTO形式的有效行列表。子类将实现
    BulkUploadService
    ,并覆盖除process()之外的所有方法,为process()方法提供数据以返回有效列表


    我想抽象出来的原因是,
    BulkUploadService
    应该处理所有业务逻辑,并为具体类返回一个有效列表,具体类应该只关注提供信息。有没有更好的方法来设计这个场景呢?

    我不太喜欢继承,你在这里使用它

    您明确定义了两项职责:

    • 处理数据(1)
    • 收集加工所需的零件(2)
    现在,您的子类应该同时承担这两个职责

    我建议您为(1)和(2)设计单独的类

    class BulkUploadService{
    私有BulkUploadDataCollector;
    列出进程(文件){…}
    }
    接口BulkUploadDataCollector{
    CellProcessors[]CellProcessors();
    布尔isDuplicatesAllowed();
    字符串[]头();
    字符串rowKey();
    }
    
    如果仔细查看
    BulkUploadDataCollector
    ,您会注意到,取回和存储数据的工作已经完成(任务又太多了)

    我将编写一个DTO类(比方说
    BulkUploadData
    ),它将
    BulkUploadDataCollector
    (现在改名为
    BulkUploadDataFetcher
    )从存储数据中释放出来,并松开
    BulkUploadDataFetcher
    BulkUploadDataService
    之间的耦合


    这两个人彼此不了解,只通过
    BulkUploadData
    实例工作。

    我没有完全理解这个问题。。。如果定义了CellProcessor来验证数据,为什么不定义另一个CellProcessor来验证重复数据呢?@AnandVaidya可能
    isDuplicatesAllowed
    是调整
    CellProcessors[]
    logicyeah。。再读一遍问题就明白了。@AnandVaidya我们使用
    CSVBeanReader
    读取csv文件中的每一行。使用
    CellProcessors
    是在读取行时验证每一列。如果所有列都有效,我们将创建一个列表或映射,并将此行添加到列表中。
    isDuplicatesAllowed
    的使用不是在已读取带有
    rowkey
    的特定行时添加行,而是删除已添加到列表或映射中的行。我们将最终返回
    列表
    地图
    我希望这一切都清楚了。嘿,安德鲁,谢谢你刚才的漂亮方法。能否请您详细说明一下如何使用BulkUploadData及其结构。我设想,
    BulkUploadData
    是一个POJO类,包含4个字段和相应的访问器方法(尽管该类可能是不可变的)。它的主要用途是在
    取数器
    服务
    之间传输数据
    Fetcher
    有一个生成构造的
    BulkUploadData
    实例的方法,
    Service
    有一个接受此类对象的方法/构造函数。@Bargath我稍后将用代码来说明这个想法
    class BulkUploadService {
         private BulkUploadDataCollector collector;
    
         List<BulkDTO> process(File file) { ... }
    }
    
    interface BulkUploadDataCollector {
         CellProcessors[] cellProcessors();
         boolean isDuplicatesAllowed();
         String[] headers();
         String rowKey();
    }