在工厂中使用反射



我有一个工厂,可以制造多种类型的对象,它可能会增长。

使用反射来返回所有不同的类型而不是调用getPrototypes()方法中的每个方法是一个好主意吗?

如果有了反射,它看起来就像这样:

public final class ShapeFactory
{
    private ShapeFactory(){} // no instance
    public static Shape buildSquare()
    {
        return new Square(2);
    }
    public static Shape buildCircle()
    {
        return new Circle(2);
    }
    public static Shape buildTriangle()
    {
        return new Triangle(2, 2, 2);
    }
    // and many more shapes...
    public static List<Shape> getPrototypes()
    {
        final List<Shape> prototypes = new ArrayList<>();
        // using reflection, call every build function
        final Method[] methods = ShapeFactory.class.getMethods();
        for(final Method picked : methods)
        {
            if(picked.getReturnType() == Shape.class && picked.getParameterTypes().length == 0)
            {
                try
                {
                    prototypes.add((Shape)picked.invoke(null));
                }
                catch(final Exception e)
                {
                    // this is an example, do not ignore
                    // exceptions in real code
                }
            }
        }
        return prototypes;
    }
}

抱歉用了Shape的例子

编辑:形状是可克隆的原型。编辑#2:改进了示例,以防有人使用。

使用反射来返回所有不同的类型而不是调用getPrototypes()方法中的每个方法,这是一个好主意吗?

这是一件合理的事情。反射代码更加复杂和脆弱,但这意味着当您添加新的形状构建器方法时不需要更改getPrototypes()。这要看哪个对你更重要。

然而,你不应该像现在这样压制异常。也许你应该更有选择性地选择你用来创建原型的方法。(当前版本将失败,如果你添加一个方法,返回一个Shape,但接受参数…或者不是一个生成器)

这实际上取决于您是希望在编译时进行类型检查,还是希望以牺牲编译时检查为代价来获得运行时探索的灵活性。

相关内容

  • 没有找到相关文章

最新更新