Ik moet voor school een applet maken waarin ik verschillende 'magische getallen' als final moet declareren.

. Ik hoop dat dit dan een demonstratie is hoe het
niet moet? Magische getallen moet je alleen gebruiken als iets ook daadwerkelijk een magisch getal is. Dit wordt helaas alleen veel te vaak niet gedaan. Zelfs in de standaard Java API's zie je bijvoorbeeld vaak integers gebruikt voor windrichtingen etc. Dit zou echter altijd gedaan moeten worden met getypeerde enumeraties.
Hoe gebruik je een magisch getal?
Simpel: stel dat we de koers van de gulden tov de euro willen hebben:
code:
1
| public static final float KOERS = 2.20371 // (ofzo) |
of als je PI wilt opnemen:
code:
1
| public static final float PI = 3.14 // .... |
Ik wil o.a. een boolean voor zomer-/wintertijd hebben, maar deze is uitkomst van een berekening.
Een zomer of wintertijd is echter geen boolean! Als een functie een boolean oplevert is dit nog niet zo'n probleem, maar als je een integer kiest (en dat moet als er meer dan 2 qwaarden zijn) wordt het veel vervelender!
Daarom zou ik altijd getypeerde enumeraties willen aanraden. Je kunt deze gebruiken door een klasse te maken waarvan de constructor private of protected in. In de klasse zet je een aantal public static instanties van deze klasse.
Voor de windrichting krijg je dan bijvoorbeeld dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| package org.pandoramix.gui;
public class CompassDirection
{
public static final CompassDirection NORTH = new CompassDirection();
public static final CompassDirection EAST = new CompassDirection();
public static final CompassDirection SOUTH = new CompassDirection();
public static final CompassDirection WEST = new CompassDirection();
public static final CompassDirection CENTER = new CompassDirection();
protected CompassDirection()
{
super();
}
} |
In jouw geval kan je bijvoorbeeld het volgende doen:
code:
1
2
3
4
5
6
7
8
9
10
11
| public class TijdRegelingsPeriode
{
public static final ZOMERTIJD = new TijdRegelingsPeriode();
public static final WINTERTIJD = new TijdRegelingsPeriode();
protected TijdRegelingsPeriode()
{
super();
}
} |
Voordelen: je kunt je methode een duidelijk type op laten leveren. Als je een parameter verwacht geldt dit natuurlijk ook. Verder kan je in de klasse ook nog extra methoden opnemen zoals bijvoorbeeld een toString(). Deze methode is relatief ook nog vrij efficient omdat er maar 2 objecten worden aangemaakt. Je kunt nu ook met de == operator objecten vergelijken.
Het probleem: waar zet ik die berekening? Voor de eerste methode (init()) werkt niet, in methode init() werkt natuurlij ook niet.
Tja, daar kan je gewoon een aparte methode voor maken lijkt mij? Je kunt daarvoor perfect een public static methode in de bovenstaande klasse maken. Deze methode kan je dan bijvoorbeeld "getCurrentPeriod" noemen. Hij krijg geen enkel argument mee en levert de huidige periode op. Is prachtig

.