java自定义的getInstance返回泛型

6次阅读

共计 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()
    {}}

以下是作者的公众号, 欢迎关注.

正文完
 0