共计 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() | |
{}} |
以下是作者的公众号, 欢迎关注.
正文完