我围绕java.lang.reflect
类创建了几个包装器:JavaClass
包裹Class<?>
,JavaMethod
包裹Method
,JavaConstructor
包裹{{ 1}},等等。
他们中的每一个人都对他们的Constructor<?>
对手给出的一些属性有吸引力。
每个包装类还提供了一组进行复杂计算的方法,它们是创建此包装类的主要原因,而不是使用原始包装类。
例如,考虑java.lang.reflect
:
JavaClass.getMethods()
请注意使用静态/**
* Gets us the list of all methods in the class. Includes all the methods
* defined in the current class plus all the inherited methods.
*/
public Set<IJavaMethod> getMethods() {
Set<IJavaMethod> javaMethods = new HashSet<IJavaMethod>();
for (Constructor<?> constructor : clss.getConstructors())
javaMethods.add(JavaFactory.createJavaMethod(constructor));
for (Method method : clss.getMethods())
javaMethods.add(JavaFactory.createJavaMethod(method));
return javaMethods;
}
类。那个类是一堆JavaFactory
种类的工厂。我想将该静态类转换为实例方法类,但这会引发必须将此服务传递给该实体的问题。
另外,它会产生以下公共静态变量的问题:
例如, JavaXXX
有一组常用于我的系统的公共静态类:
JavaClass
我可以通过在另一个类public class JavaClass implements IJavaType {
private final Class<?> clss;
public static final JavaClass VOID = new JavaClass(void.class);
public static final JavaClass BOOLEAN = new JavaClass(boolean.class);
public static final JavaClass STRING = new JavaClass(String.class);
public static final JavaClass OBJECT = new JavaClass(Object.class);
public static final JavaClass INTEGER = new JavaClass(int.class);
...
}
上使用此方法来“解决”该问题,但至少有一个JavaClassHelper
无法轻松访问方法的方法很尴尬。 JavaClass
需要JavaClass
的原因是它经常需要将来自JavaFactory
世界的数据封送到我的包装器中。 java.lang.reflect
虽然是JavaFactory
的依赖关系,但并不是唯一的例子。我有更多的方法也大量使用其他一些服务,虽然因为它们有一个空的构造函数,代码的作者决定只是在现场实例化它们。
如何建模?理论上,从JavaClass
中取出所有服务的想法似乎是王牌,但在现实世界中,似乎有点不切实际,在友好的api意义上。
另一个想法是让服务通过构造函数传递,并且只通过JavaClass
实例化JavaXXX
类,将所有这些问题隐藏到外部世界。
答案 0 :(得分:2)
如果您确实需要使用工厂来实例化JavaConstructor
和JavaMethod
的实例,并且您想要避免静态引用,那么您需要使用Java Service Provider机制。
但是,我认为问题的根本原因是首先使用工厂模式。
根据我的经验,最好解决根本原因,而不是症状。
工厂对直接调用JavaConstructor
和JavaMethod
的构造函数有什么好处?
由于getMethod
已经在构造函数和方法之间进行切换,因此重载方法JavaFactory.createJavaMethod
提供的切换似乎不会带来任何好处。据推测,JavaFactory.createJavaMethod
方法只是调用各自返回类型的构造函数?那么为什么不丢失工厂模式,只是首先通过他们的构造函数直接创建对象,然后你就会留下这样的东西:
public class JavaClass
{
...
/**
* Gets us the list of all methods in the class. Includes all the methods
* defined in the current class plus all the inherited methods.
*/
public Set<IJavaMethod> getMethods()
{
Set<IJavaMethod> javaMethods = new HashSet<IJavaMethod>();
for (Constructor<?> constructor : clss.getConstructors())
{
javaMethods.add(new JavaConstructor(constructor));
}
for (Method method : clss.getMethods())
{
javaMethods.add(new JavaMethod(method));
}
return javaMethods;
}
...
}