如何更好地解决在类似API的系统上拥有具有服务依赖性的实体的问题?

时间:2012-02-29 19:59:05

标签: java oop dependency-injection domain-driven-design

我围绕java.lang.reflect类创建了几个包装器:JavaClass包裹Class<?>JavaMethod包裹MethodJavaConstructor包裹{{ 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类,将所有这些问题隐藏到外部世界。

1 个答案:

答案 0 :(得分:2)

如果您确实需要使用工厂来实例化JavaConstructorJavaMethod的实例,并且您想要避免静态引用,那么您需要使用Java Service Provider机制。

但是,我认为问题的根本原因是首先使用工厂模式。

根据我的经验,最好解决根本原因,而不是症状。

工厂对直接调用JavaConstructorJavaMethod的构造函数有什么好处?

由于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;
  }

  ...
}