作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在写一个小类,我遇到了一个问题。
这个类读取CSV文件,每个键只有一个值。我有
class CSVMap<T> extends AbstractMap<String,T>
我有:
public void load(String filename)
{
try
{
BufferedReader out=new BufferedReader(new FileReader(filename));
String []tab;
T value;
while(out.ready());
{
tab=out.readLine().split(",");
}
} catch (IOException e)
{
e.printStackTrace();
}
}
现在我需要创建 T 的新实例以将它们放入我的映射中(我知道 T 具有采用字符串的构造函数)。
我知道 Java 中的类型删除,所以唯一的出路是a) 将 T.Class 传递给我的加载方法或将其保存在我的类中的某个私有(private)位置或者b) 保留一些私有(private)对象 T 并在方法中使用它来获取 Class 对象?
我问是因为我想确定是否没有任何其他方法可以做到这一点。
最佳答案
您还可以考虑另一种方式。那就是让您的 CSVMap 将一个对象作为其构造函数的参数,该对象知道如何从一个类转换为另一个类。
例如。
public class Test {
public static void main(String[] args) {
CSVMapLoader<Integer> loader = new CSVMapLoader<Integer>(new IntegerParser());
loader.load();
}
}
class CSVMapLoader<T> {
private final Parser<T> parser;
public Loader(Parser<T> parser) {
this.parser = parser;
}
public CSVMap<T> load() {
// as an example of how to get your T
T t = parser.parse("1000");
System.out.println("t equal to 1000? "+(t.equals(1000)));
// and instead put your real logic to load up map here
}
}
interface Parser<T> {
public T parse(String str);
}
class IntegerParser implements Parser<Integer> {
public Integer parse(String str) {
return Integer.valueOf(str);
}
}
作为代码设计的旁注。在这种情况下,您不应该真正继承 (Abstract)Map 。你想要的是知道如何从 csv 文件加载键值对的类。 Map 接口(interface)只是在加载后存储和访问这些对。所以你真的想要一个单独的工厂类,它接受一个文件、解析器和可能的基本 map 类型并为你加载 map 。留给您一个未受影响的 map 实例,您不知道它是如何加载的。
关于Java 泛型和反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8371532/
我是一名优秀的程序员,十分优秀!