共计 1148 个字符,预计需要花费 3 分钟才能阅读完成。
1. 背景
实际中经常使用 getInstance()方法返回一个对象, 对于工厂模式, 传入对应的参数返回与之相对应的对象. 但是, 问题来了, 返回的对象需要被强制转换, 很麻烦.
import java.lang.reflect.*;
public class test
{public static void main(String[] args) {test1 t1 = factory.getInstance("test1");
test2 t2 = factory.getInstance("test2");
}
}
class factory
{public static Object getInstance(String className)
{
try
{return Class.forName(className).getConstructor().newInstance();
}
catch(Exception e)
{e.printStackTrace();
}
return null;
}
}
class test1
{public test1()
{}}
class test2
{public test2()
{}}
编译不通过, 说类型不兼容.
因此加上强制类型转换, 编译通过了.
test1 t1 = (test1)factory.getInstance("test1");
test2 t2 = (test2)factory.getInstance("test2");
2. 如何处理
例子只有两个类, 手动强制转换还可以, 但如果多个类咋办啊? 而且作者是那种非常懒的人, 也不想手动去转换, 因此, 用大招 —– 泛型!
3. 使用泛型
使用 Class<T> 泛型可以避免强制转换 从而更有效地偷懒 , 需要把返回类型改成 <T> T, 同时由于使用了 T, 必须修改传进来的参数.
public static <T> T getInstance(Class<T> t)
4. 完整代码
import java.lang.reflect.*;
public class test
{public static void main(String[] args) {test1 t1 = factory.getInstance(test1.class);
test2 t2 = factory.getInstance(test2.class);
}
}
class factory
{public static <T> T getInstance(Class<T> t)
{
try
{return t.getConstructor().newInstance();}
catch(Exception e)
{e.printStackTrace();
}
return null;
}
}
class test1
{public test1()
{}}
class test2
{public test2()
{}}
以下是作者的公众号, 欢迎关注.
正文完