我遇到了以下几行代码:
import org.apache.shiro.util.Factory;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
.....
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
您能解释一下这段代码,特别是Factory<SecurityManager>
的含义以及为什么有泛型参考<SecurityManager>
以及为什么需要它?
答案 0 :(得分:2)
此处使用通用引用来避免未经检查的强制转换。这是泛型省略的等价物可能看起来像
Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = (SecurityManager) factory.getInstance();
因此,在这种情况下,Factory<SecurityManager>
表示工厂应返回SecurityManager
而不是Object
。
答案 1 :(得分:2)
泛型是编译时间标记,为您的编译器提供输入信息和模板。它们在运行时不存在。您甚至可以忽略代码中的通用信息:
Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
在这种情况下,由于未经检查的类型,您会从IDE(Eclipse)收到一个小警告,但您可以使用SupressWarning注释来抑制它。
@SuppressWarnings("unchecked")
Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
您的代码仍然可以编译而没有任何问题。 例如,您有一个Calculate类:
class Calculate<T extends Number> {
private T value;
public T add(T value1, T value2) {
return
}
}
这是一个模板,你可以使用你的计算实用程序,每个类型扩展数字。
Calculate<Integer> calculator = new Calculate<Integer>();
calculator.add(1 , 2);
或双版;
Calculate<Double> calculator = new Calculate<Double>();
calculator.add(1.2d , 2.3d);
泛型使您的代码变得灵活,并允许您编写此类模板。
Factory是软件工程中的一个习惯用法,用于使用这些工厂类创建对象。我会研究工厂模式,依赖倒置,霍利伍德原理。 关于(摘要)工厂模式甚至维基百科上有很多线程。
答案 2 :(得分:1)
工厂类是一种设计模式,适用于构造其他类实例的类。例如,一个名为PointFactory的类通常会有一个名为getinstance的方法返回一个Point类型的新对象。工厂类用于隐藏类的构造函数的直接用法。
有时你有一个工厂类可以生成许多类型的对象。在这种情况下,我们有一个Factory类,其泛型类型是SecurityManager,并且由于Factory类的getInstance方法从泛型类型返回一个新对象,因此在它下面的行上实际上返回一个ScurityManager类型的新对象。
IniSecurityManagerFactory是扩展Factory的类,因为顾名思义,它是一个用于生成SecurityManager的工厂。
请参阅http://en.wikipedia.org/wiki/Abstract_factory_pattern
编辑:添加了更多信息
答案 3 :(得分:0)
这是一种名为Abstract Factory的常见设计模式:http://en.wikipedia.org/wiki/Abstract_factory_pattern
据我所知,你告诉工厂,你想要生产SecurityManagers