使用泛型绝对是我的弱点,可以使用一些帮助。
该项目旨在开发一个简单的订单/库存系统,用于下订单,跟踪物料和库存,并记录自项目首次启动以来的所有库存和客户添加/删除。这需要读取和写入文件,我选择了CSV格式进行解析。有两个要解析的文件,一个用于Customers
,另一个用于Items
。
我想使用TreeSet来添加/搜索log N,但是我的文件解析遇到了一些麻烦。我希望有一个单独的解析类在执行时接受集合和文件路径,并将文件处理成一组完整的对象,而不是两个类都有重复代码用于它们的对象类型,两者都有不同领域和方法。
我提出的唯一解决方案是TreeSet<? extends Object>
,但这意味着我必须打包,然后将每个对象取消装箱,因为它在结构中被访问。
有更简单的方法吗?
答案 0 :(得分:4)
以下是您的层次结构可能是什么样子的示例
class CVSParser<T> {
private final RecordHandler<T> handler;
public CVSParser<T>(RecordHandler<T> handler) {
this.handler = handler;
}
public Set<T> parse(File f) {
Set<T> records = new TreeSet<T>();
for (String line : file ) { //I'm paraphrasing here
records.add(handler.parse( splitIntoFields(line) ));
}
}
}
interface RecordHandler<T> {
public T parse(String[] fields);
}
class CustomerHandler implements RecordHandler<Customer> {
public Customer parse(String[] fields) {
return new Customer(fields[0], fields[1]);
}
}
class ItemHandler implements RecordHandler<Item> {
//...
}
Set<Item> items = new CVSParser<Item>(new ItemHandler()).parse(itemsFile);
或者,您可以将泛型下推到CVSParser
的方法级别,并使其保持静态:
class CVSParser {
public static <T> Set<T> parse(RecordHandler<T> handler, File f) {
//...
}
}
Set<Item> items = CVSParser.parse(new ItemHandler(), itemsFile);
答案 1 :(得分:2)
您在寻找
吗?interface CSVParseableObject {
// routines
}
public class Customers implements CSVParseableObject{}
public class Items implements CSVParseableObject{}
然后
TreeSet<CSVParseableObject>
您解析的内容可以使用例如
Set<CSVParseableObject> parse(String path) {
Set<CSVParseableObject> parseableObjects = new TreeSet<CSVParseableObject>();
File file = new File(path);
// parse ...
return parseableObjects;
}
答案 2 :(得分:0)
这是一个选项:
设计一个类来表示Inventory项目,并扩展或(更好地)实现解析接口。通过这种方式,您只需将Inventory对象插入树中即可。
,例如TreeSet<Inventory> tree = TreeSet<Inventory>()
tree.add(库存对象)等
答案 3 :(得分:0)
猜猜你确实很困惑。
每个文件代表来自不同对象类型(客户和项目)的数据,因此它们的格式不同,其字段也不同。你不能用相同的代码解析它们。
我希望有一个解析类在执行时接受集合和文件路径,并将文件处理成一组完整的对象,这两个对象都有不同的字段和方法。
您可以拥有一个类,但是您需要使用不同的代码来读取这两种不同的文件类型。事实上,您希望填充一个通用的集合对象,以避免您以自己的方式处理每个文件类型。泛型仅用于为您节省一些手动转换,并避免意外将不需要的对象添加到集合中。
您可以在代码中执行以下操作:
class MyParser {
public Set<Customer> readCustomersFile(String path) {...}
public Set<Item> readItemsFile(String path) {...}
}
你可以用较少的“自定义代码”方式来实现......一个嵌入式数据库可能......但如果你现在想做的话,你会学到新的方法来做同样的事情。