我在阅读文件方法时有以下代码:
FileReader fileReader = new FileReader(fName);
bf = new BufferedReader(fileReader);
while ((line = bf.readLine()) != null) {
if (line.contains("Worker")) {
info = line.split(" ");
int x = Integer.parseInt(info[1]);
int y = Integer.parseInt(info[2]);
worker = new Worker(new Point(x, y);
globalList.add(worker);
}
if (line.contains("Work")) {
info = line.split(" ");
int x = Integer.parseInt(info[1]);
int y = Integer.parseInt(info[2]);
work = new Work(new Point(x, y);
globalList.add(work);
}
if (line.contains("Bulldozer")) {
info = line.split(" ");
int x = Integer.parseInt(info[1]);
int y = Integer.parseInt(info[2]);
bulldozer = new Bulldozer(new Point(x, y);
globalList.add(bulldozer);
}
}
通过这段代码,我可以从一个看起来像这样的文件中读取:
Worker 5 0
Bulldozer 7 5
Work 4 2
Work 4 8
我正在使用BufferedReader
执行此操作,我在此案例类Worker
,Bulldozer
和Work
中创建类的实例,读取文件中的单词(这是类的名称)并获取x和y位置,并将该对象添加到列表中。
这很完美,我的问题是这看起来很难编码而且这不是一个好主意,因为这是一个学校项目,所以你们有任何提示可以帮助我使这个代码多一点动态,也许只是在if语句?
答案 0 :(得分:1)
基本上,if
的所有三个分支都做同样的事情 - 它们读取两个整数,准备一个点,然后将它注入一个对象。
唯一不同的是第一个字符串和类名。使用反射,你可以使它成为通用的 - 在包中搜索名为string的类,创建Point
,然后调用类的单参数构造函数。
如果没有反射,您仍然可以通过一个方法来提取它,该方法将String
和Function<Point, Object>
作为工厂参数。
该方法可以做到这一点:
public void readIfMatches(String line, String match, Function<Point, Object> factory) {
if (line.contains(match)) {
String info = line.split(" ");
int x = Integer.parseInt(info[1]);
int y = Integer.parseInt(info[2]);
globalList.add(factory.apply(new Point(x, y));
}
}
然后你调用这样的三个迭代:
readIfMatches(line, "Bulldozer", Bulldozer::new)