Meuh, ik vind dat constructor initialisatie
altijd de voorkeur zou moeten hebben over dit. Waarom runtime controleren wat je compile-time (of, in het geval van een beetje IDE, schrijf-time) kunt controleren? Nee, je hebt geen named variables bij constructors, maar qua syntax kun je nog wel zoiets doen:
Java:
1
2
3
4
5
| Object obj = new Object(
pietje,
henkje,
klaasje
); |
Een lelijke oplossing om toch een soort van 'named' params te krijgen is het builder pattern misbruiken. Nee dit moet je niet overnemen, nee dit is niet ongelofelijk slim om te doen, en ja, named arguments zou een goed iets zijn:
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
| class PietjeBuilder {
public String pietje;
public Object klaas;
public int henk;
}
class Pietje {
private final String pietje;
private final Object klaas;
private final int henk;
// ja ook dit zou beter moeten kunnen. Zelfs met IDE hulp wordt je hier simpel van.
public Pietje(String pietje, Object klaas, int henk) {
this.pietje = pietje;
this.klaas = klaas;
this.henk = henk;
}
}
public static void main(String[] args) {
PietjeBuilder pietjeBuilder = new PietjeBuilder();
pietjeBuilder.pietje = "HENKJE";
pietjeBuilder.klaas = RandomObjectBuilderFactory.getFactory().newInstance(new Random().nextInt(1337));
pietjeBuilder.henk = 1337;
Pietje pietje = new Pietje(
pietjeBuilder.pietje,
pietjeBuilder.klaas,
pietjeBuilder.henk
);
} |
Named parameters, verplicht in te vullen @ build-time, wat wil je nog meer?
Fake edit: Ow wacht, dit kan ook nog:
Java:
1
2
3
4
5
6
| PietjeBuilder pb = new PietjeBuilder();
Pietje pietje = new Pietje(
pb.pietje = "henk",
pb.klaas = new Object(),
pb.henk = 3771
); |

maar het werkt wel. Je moet alleen voor het object dat je wilt initialiseren een nieuw builder object maken met dezelfde velden.
[random idee] Misschien is er een tooltje te bouwen die automagisch dit soort builders voor elk object aanmaakt oid[/random idee]
Echte edit: Wat ook nog kan: initializer block misbruiken, bouw je een subclass inline. Helaas geen compile-time-verplichte-velden-verplichting.
Java:
1
2
3
4
5
| Pietje pietje = new Pietje() {{
setPietje("henk");
setKlaasje("piet");
setLeetje(1337);
}}; |
Echte edit 2: Wat V zegt dus.
[
Voor 6% gewijzigd door
YopY op 20-01-2011 22:03
]