开发者

Java - Generically handling the creation of subclasses

开发者 https://www.devze.com 2023-04-07 23:45 出处:网络
I have three classes that are quite similar, excepting a single method. Therefore, I chose to put the rest of their functionality into an abstract superclass. When it comes to creating instances of th

I have three classes that are quite similar, excepting a single method. Therefore, I chose to put the rest of their functionality into an abstract superclass. When it comes to creating instances of these classes, however, I'm at a loss for how to implement what seems to me like the "obvious" or "elegant" approach. Their constructors are essentially identical, and I need multiple instances of each, so I wanted to do something like the following:

private SubclassA[] subclassA_array, SubclassB[] subclassB_array, SubclassC[] subclassC_array;
subclassA_array = new SubclassA[getNumInstancesOfClassANeeded()]
subclassB_array = new SubclassA[getNumInstancesOfClassBNeeded()]
subclassC_array = new SubclassA[getNumInstancesOfClassCNeeded()]

// might have my syntax wrong here; array of the three subclass arrays
private Superclass[][] superArray = new Superclass[][3];
superArray[0] = subc开发者_如何学PythonlassA_array;
superArray[1] = subclassA_array;
superArray[2] = subclassA_array;
for ( Superclass[] array: superArray )
    for(int i = 0; i< array.length; i++)
      //  array[i] = new..... what goes here?
    }
}

How would I find the appropriate class to construct in that innermost loop? Is this actually a really oddball way of approaching the problem; have I missed something more obvious? Should I just say "to hell with it!" and just have three separate loops?


Should I just say "to hell with it!" and just have three separate loops?

IMO, yes.


You could do the following:

  1. Use array.getClass() to get the class of the array,
  2. Use getConmponentType() to get the array's base type
  3. Use newInstance() to create an instance
  4. Assign the instance reference to the array.

... but this results in fragile code and is like using a sledge-hammer to crack a walnut.


You could work with reflection in your inner loop, something like array.getClass().getComponentType().newInstance(), but I think there might be better solutions to the overall problem (To answer that, I'd need more information about what you want to code)


You can create an static method

public static subclassA[] getNewInstances(int numberOfInstances);

static methods can be accessed without the need to create a new instance SubclassA.getNewInstances(3).

In your definition of the matrix, you need to define first the first dimension (so it becomes new Superclass[3][]

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号