Okee, hier heb ik er eentje voor de collega Java guru's. 
Situatie:
Toelichting bij code:
BVD
Situatie:
- Een abstracte super class (Attribute)
- Meerdere subclasses van deze class Attribute
- Attribute dient als een factory op te treden. Dus, ipv dat je van de subclasses de constructor gebruikt (die zullen package visible zijn), roept de code een newInstance()-methode aan op Attribute. Deze retourneert vervolgens een nieuwe instantie. Omdat deze newInstance methode wordt overge-erft naar de sub-classes, moet de methode via een this.getClass() achtige constructie achterhalen van welke subclass hij de constructor moet aanroepen. Uiteraard worden alle instanties in een private Vector bijgehouden in de Attribute class, zodat er geen "dubbele instanties" kunnen voorkomen (dwz, meer dan één objecten met zeg-maar dezelfde waarde [er in]).
- De slimmerikken hadden al opgemerkt dat de methode getClass() niet kan worden gebruikt binnen static methodes.
En als je gewoon het attribuut class aanspreekt (als in ClassNaam.class), vindt-ie het ook niet goed. Natuurlijk werkt de this referentie ook niet.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
| public abstract class Attribute { private int skill; private static final java.util.Vector heap = new java.util.Vector(); Attribute(int s) { skill = s; } public static final Attribute newInstance(final int skill) throws InstantiationException { Class skillClass = getClass(); // hier gaat het mis!! Attribute element; Attribute returnElement = null; for (int i = 0; heap != null && i < heap.size() && returnElement == null; i++) { element = (Attribute)heap.elementAt(i); if (element.getSkill() == skill) returnElement = element; } if (returnElement == null) { try { //System.out.println("NewInstance: " + skillClass.getName() + " (" + skill + ")"); Constructor skillClassConstructor = skillClass.getConstructor(new Class[]{Integer.TYPE}); returnElement = (Attribute)skillClassConstructor.newInstance(new Object[]{new Integer(skill)}); if (heap != null) heap.addElement(returnElement); } catch (NoSuchMethodException e) { System.out.println("nsme"); InstantiationException eNew = new InstantiationException(e.getMessage()); eNew.setStackTrace(e.getStackTrace()); throw eNew; } catch (IllegalAccessException e) { System.out.println("iae"); InstantiationException eNew = new InstantiationException(e.getMessage()); eNew.setStackTrace(e.getStackTrace()); throw eNew; } catch (InvocationTargetException e) { System.out.println("ite"); InstantiationException eNew = new InstantiationException(e.getMessage()); eNew.setStackTrace(e.getCause().getStackTrace()); throw eNew; } } return returnElement; } public final int getSkill() { return skill; } } |
Toelichting bij code:
- De 'waarde' waar ik het hierboven over had is natuurlijk die integer skill.
- De regel waar het fout gaat is aangegeven.
BVD