【发布时间】:2020-05-20 22:55:33
【问题描述】:
我想要达到的目标:
我目前正在通过尝试创建一个程序来更深入地研究 Java,该程序可以读取银行账户中的 .csv 导出文件并使用它来做一些很酷的事情。
由于不同的银行有不同的文件导出,我创建了一个抽象类 Bank,它只有普遍存在的数据字段,例如在任何交易中转移的资金。然后,我为每个单独的银行创建了一个子类,每个子类都扩展了抽象 Bank 类。在每个子类中,我创建了一个文件加载器方法来管理其特定的 .csv 标准。
我的问题:我希望程序在读取任何给定文件时动态决定在运行时使用哪个 Bank 子类。然后该子类使用它的方法来读取文件,以及将哪些数据传输到它的超类。但是,我不想每次添加新的子类时都添加新的if(inputString == bankSubclassName) { bankSubclass.loadFile() }。
是否可以创建一个在运行时读取参数的系统,例如。一个字符串,然后使用子类“链接”到该参数的方法?每次添加新的子类时都不必编辑主程序?
目前,我似乎有一个心理障碍,我完全被困住了。也许有更好的方法?
提前致谢!
【问题讨论】:
-
银行不会是 IRL 的子类;银行就是银行。每家银行可能有一个或多个 csv 阅读器。然后你要么有一个简单的 csv 解析器工厂,要么有一个类的映射,或者你可以根据需要创建一个实例的任何东西。创建插件系统的方法有很多种,但基本上您需要扫描类路径以找到特定类型的类,然后将它们自己注册为 csv 阅读器。
-
是的,创建一个
Map<String, BankFactory>,其中interface BankFactory { Bank create(); }。您可以将地图填充为map.put("subclass", new SubclassFactory()),其中class SubclassFactory implements BankFactory { public Bank create() { return new Subclass(); } }。在处理之前,您应该始终清理您的输入。允许客户端动态加载他们想要的任何类可能会导致类似于 SQL 注入的漏洞。
标签: java inheritance