【问题标题】:Using java generics for a simple factory - How can I avoid these warnings将 java 泛型用于简单工厂 - 如何避免这些警告
【发布时间】:2012-03-11 08:20:29
【问题描述】:

我正在尝试正确理解泛型,并且我编写了一个非常简单的工厂,但我不知道如何绕过这两个警告(我已经很好地抱怨了,但可能我不是使用正确的术语进行搜索)。哦!而且我不想仅仅禁止警告 - 我很确定应该可以正确做到这一点。

  • 类型安全:构造函数 simpleFactory(Class) 属于原始类型 simpleFactory。对泛型 simpleFactory 的引用应该被参数化
  • simpleFactory 是原始类型。对泛型 simpleFactory 的引用应该被参数化

我试图解决这个问题的所有构造实际上都无法编译——这似乎是我能得到的最接近的。生成警告的是标记为 ++++ 的行(在 Eclipse Indigo 上用于 android 项目)

我意识到周围有一些优秀的对象工厂,但这是关于理解语言而不是实际制作工厂;)

这里是来源:

import java.util.Stack;

public class simpleFactory<T> {

private Stack<T> cupboard;
private int allocCount;
private Class<T> thisclass;

public static simpleFactory<?> makeFactory(Class<?> facType) {
    try {
        facType.getConstructor();
    } catch (NoSuchMethodException e) {
        return null;
    }
+++++   return new simpleFactory(facType);
}

private simpleFactory(Class<T> facType) {
    thisclass = facType;
    cupboard = new Stack<T>();
}

public T obtain() {
    if (cupboard.isEmpty()) {
        allocCount++;
        try {
            return thisclass.newInstance();
        } catch (IllegalAccessException a) {
            return null;
        } catch (InstantiationException b) {
            return null;
        }
    } else {
        return cupboard.pop();
    }
}

public void recycle(T wornout) {
    cupboard.push(wornout);
}   
}

【问题讨论】:

    标签: java generics objectfactory


    【解决方案1】:

    所以重要的部分是你实际上想要捕获传递给工厂方法的类的类型。我使用的是相同的标识符 (T),它隐藏了类的类型,这可能有点令人困惑,因此您可能希望使用不同的标识符。

    您还需要使用特定类型实例化该类,例如前面提到的 cutchin。

    public static <T> simpleFactory<T> makeFactory(Class<T> facType)
    {
        try
        {
            facType.getConstructor();
        }
        catch (NoSuchMethodException e)
        {
            return null;
        }
        return new simpleFactory<T>(facType);
    }
    

    【讨论】:

    • 这就是答案 - 而静态 classname 不是我很久之前想到的语法。
    【解决方案2】:

    我之前的答案完全被打破了。这是更好的工厂方法。

    public static <R> simpleFactory<R> makeFactory(Class<R> facType) {
        try {
            facType.getConstructor();
        } catch (NoSuchMethodException e) {
            return null;
        }
       return new simpleFactory<R>(facType);
    }
    

    用法:

    simpleFactory<String> factory = simpleFactory.makeFactory(String.class);
    

    【讨论】:

    • 这当然是鸡和蛋,虽然 cutchin。如果 makeFactory 方法不是静态的,我将失去返回工作工厂或 null 的好处。我也可以将构造函数公开,但这意味着它可能会在第一次调用 get 时失败,而使用静态 makefactory 方法我可以在工厂设置时检查后来失败的主要原因,所以工厂客户的很多不太可能无法从 get 中取回对象。
    • 哦,对不起,让它保持静止。我只是将代码粘贴到我正在处理的另一个类中,在那个范围内它不能是静态的。重要的是 部分。
    • 啊!去过那里,如果我更换?在我得到的静态方法中使用 T - 无法对非静态类型 T 进行静态引用
    • 不,我之前写的根本行不通。试试上面的方法。
    • 使用也有点好 - 以为我需要从 makefactory 转换结果,但现在这真的很好而且干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2012-03-18
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多