在java,软件设计中查找关于类的信息?

时间:2010-08-01 11:29:11

标签: java design-patterns class class-design

我有一堆扩展抽象Base类的类。 每个子类都采用构造函数中的数组(不同长度取决于类)。 这些课程可以由其他人编写。

确定类所需数组长度的最佳方法是什么? 我可以: (A)要求每个派生类都有一个静态方法,返回长度。 但是,基类不能强制执行此操作,因为抽象静态方法在java中不起作用。 (B)每个派生类都有一个没有参数的构造函数,我构造了 这样的类只是为了能够调用countParameters()方法,即 我可以从Base类强制执行。这感觉“笨拙”,因为我对创建这样的对象不感兴趣,但只需要一些关于它的信息。

原因是我正在创建一个GUI,使用户能够创建 派生类的实例,但每个派生类使用不同数量的参数。 也就是说,在创建类之前,我需要知道如何绘制GUI。

编辑: 我可以要求每个Derived类都有一个私有 构造函数,没有参数,并使用反射我可以调用countParameters()方法。

EDIT2:实际上,我感兴趣的是参数的名称是什么。 也就是说,如果Derived类具有构造函数

public Derived(double name1,double name2,...)

我需要一种方法来生成String []数组

{name1,name2,...}

我想如果不创建类的实例,这是不可能的, 但是为了让用户能够创建这样的类,他/她需要参数名称! 片刻22。

4 个答案:

答案 0 :(得分:5)

听起来你需要Factory Pattern

一般来说,基类知道它的后代集是一个坏主意。所以你定义了另一个类,它的工作就是知道它。

如果你有像Shape这样的东西,将ThisShape和ThatShape作为派生类,那么ShapeCreator将处理创建程序支持的特定形状集的工作,为每个人提供所需的参数。

答案 1 :(得分:0)

目前还不太清楚你想要实现什么,但我想知道:子类是否真的必须使用数组的单个参数,而不是参数列表?

Constructor<?> ctor = Test.class.getConstructors()[0];
int parameterCount = ctor.getParameterTypes().length;
ctor.newInstance(new Object[parameterCount]);

答案 2 :(得分:0)

how about this code:

public absract Base {

   public abstract int size();

   public Base(Object[] objs) {
      if (objs.length != size()) {
         throw new IllegalArgumentException();
      }
    //rest of your code.
}

每个子类都需要实现size方法。

希望得到它的帮助。

答案 3 :(得分:0)

我会选择方法A.你不能让编译器强制执行这样的方法,但是你当然可以在你的程序中强制执行它 - 没有方法,没有工作!

说真的,整个方案有点脆弱,我想不出一种方法可以让它明显更好。这些子类的错误实现将会爆炸,这就是生命。

可能的补救措施是为这些子类提供一组接口,例如

SubClassTaking2Args
SubClassTaking3Args
...

并要求您的sub实现其中一个作为标记接口。但这只是更多官僚主义,而且影响更小。