0

使用泛型绝对是我的弱点,在这方面可以使用一些帮助。

该项目是开发一个简单的订单/库存系统,该系统可以下订单、跟踪项目和库存,并记录自程序首次启动以来的所有库存和客户添加/删除。这需要读取和写入文件,我选择了 CSV 格式进行解析。有两个文件需要解析,一个Customers用于Items.

我想使用 TreeSet 来添加/搜索日志 N,但是我的文件解析遇到了一些问题。我不想让两个具有重复代码的类为其对象类型工作,我希望有一个解析类在执行时接收集合和文件路径,并将文件处理成一组完整的对象,两者都有不同领域和方法。

我想出的唯一解决方案是TreeSet<? extends Object>,但这意味着我必须将每个对象装箱,然后在结构中访问每个对象时将其拆箱。

有没有更简单的方法?

4

4 回答 4

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);
于 2011-02-01T19:00:11.237 回答
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;
}
于 2011-02-01T18:51:38.687 回答
0

这是一个选项:

设计一个类来表示一个 Inventory 项目,并让该类扩展或(更好地)实现您的解析接口。通过这种方式,您可以简单地将 Inventory 对象插入到您的树中。

例如,TreeSet<Inventory> tree = TreeSet<Inventory>() tree.add(Inventory Object) 等。

于 2011-02-01T18:53:08.650 回答
0

猜猜你确实很困惑。

每个文件代表来自不同对象类型(客户和项目)的数据,因此它们的格式不同,它们的字段也不同。您不能让相同的代码同时解析它们。

我希望有一个解析类在执行时接收集合和文件路径,并将文件处理成一组完整的对象,它们都有不同的字段和方法。

您可以有一个类,但您需要不同的代码来读取两种不同的文件类型。并不是您希望填充一个通用集合对象,这将避免您以自己的方式处理每种文件类型。泛型仅旨在为您节省一些手动转换并避免将不需要的对象意外添加到集合中。

您可以在代码中执行以下操作:

class MyParser {
    public Set<Customer> readCustomersFile(String path) {...}
    public Set<Item> readItemsFile(String path) {...}
}

您可以使用较少的“自定义代码”方式来完成它......也许是一个嵌入式数据库......但如果你现在希望这样做,随着时间的推移,你将学习新的方法来做同样的事情。

于 2011-02-01T18:55:56.720 回答