gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:35 25 4
gpt4 key购买 nike

我围绕 java.lang.reflect 创建了几个包装器类(class):JavaClass包装 Class<?> , JavaMethod包装 Method , JavaConstructor包装 Constructor<?>等等。

他们每个人都在他们的 java.lang.reflect 给出的一些属性周围失去了 getters同行。

每个包装类还提供了一组进行复杂计算的方法,它们是创建此包装类而不是使用原始包装类的主要原因。

例如,考虑 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 的使用类(class)。那个类是一堆JavaXXX的工厂。种类的类。我想将该静态类转换为实例方法类,但这会引发必须向该实体传递服务的问题。

另外,它会产生以下公共(public)静态变量的问题:

JavaClass ,例如,有一组在我的系统中常用的公共(public)静态类:

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 中整理数据世界给我的 wrapper 。 JavaFactory尽管依赖于 JavaClass 并不是唯一的情况, 尽管。我还有几个方法也大量使用其他一些服务,尽管由于它们有一个空的构造函数,代码的作者决定就地实例化它们。

如何建模?理论上,将所有服务从 JavaClass 中取出的想法似乎是王牌,但在现实世界中,从友好的 API 角度来看,它似乎有点不切实际。另一个想法是让服务通过构造函数传递,并且只实例化 JavaXXX通过 JavaFactory 上课,向外界隐藏所有这些事情。

最佳答案

如果你真的需要使用工厂来实例化 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;
}

...
}

关于java - 如何更好地解决在类 API 系统上存在具有服务依赖性的实体的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9505732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com