问题
我有一些数据存储在文本文件中,它包含两个java.lang.String字符串:第一个包含了我的数据值,第二个是数据类型,例如,java.lang.Long、java.lang.Double等等。
那么,我如何构造包含我文本文件中给定类型的对象呢?
蹩脚的解决方案
对所有支持的一个很长的if-else-if扫描链,然后使用parse*(Integer.parseInt、Double.pareseDouble等)方法可以解决该问题。
为什么如此蹩脚?简单的说,因为想要加一种支持的类型就需要扩展if-else-if链,然后这将导致最终的代码过长和不易维护。
古怪的解决方案(funky solution)
使用可能的Java反射的力量。
Java代码
- Class objClass = Class.forName(type);
- Class[] prototype = {String.class};
- Constructor ctor = objClass.getConstructor(prototype);
- return ctor.newInstance(new Object[]{value});
那么,这4行代码做了什么呢?
我们通过type字符串(我数据文件中的第二个字符串)定义的类来构造一个Class的实例,然后我们通过唯一的一个字符串作为参数来获取它的构造方法,这里构造方法的签名由prototype变量来定义;最后,我们通过向构造方法传入一个字符串值来构造对象。
那么为什么它古怪呢?
首先,因为它用4行代码完成了我们蹩脚的解决方案所完成的代码,更古怪的是,它不仅可以构造Integer、Long和Double,同样可以使用字符串来构造任何类型的对象。