Toon posts:

[Java] final declareren in applet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik moet voor school een applet maken waarin ik verschillende 'magische getallen' als final moet declareren. Ik wil o.a. een boolean voor zomer-/wintertijd hebben, maar deze is uitkomst van een berekening. De berekening vergelijkt het aantal seconden dat verstreken is in het lopende jaar met de secondenrange waarin het wintertijd is in dat jaar. Als het aantal verstreken seconden binnen de wintertijdrange ligt moet "final boolean jaHetIsWintertijd" de waarde true krijgen, of anders de waarde false.
Het probleem: waar zet ik die berekening? Voor de eerste methode (init()) werkt niet, in methode init() werkt natuurlij ook niet. Ik heb ook geprobeerd om voor de waarde een aperte methode (wintertijd()) aan te roepen. Ik kan echter nergens vinden hoe het WEL moet. Kan iemand het uitleggen of een link naar een voorbeeld posten? Thanx, Rubenski.
ps. hier staat de opdracht: http://www.swi.psy.uva.nl/java/java0102/java0102inl/week06/h6o2.datumklok3/h6o2.htm

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

geef anders ook ff het email adres van je docent dan sturen wij het wel op..

Verwijderd

Topicstarter
Rubenski@hotmail.com hehehe. Het is kerstvakantie Wasigh. Docenten kun je niets vragen in kerstvakanties. Als je een leuke link voor me hebt zal ik "Many thanks go to Wasigh from Tweakers" in de headercomments zetten, deal? [no offense] *D (en daarnaast, dit is mijn huiswerk van volgend trimester! Ik vraag het uit interesse, niet omdat ik geen zin heb in mijn huiswerk)

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

finals zijn zoals de naam al zegt final, en zijn dus niet te wijzigen..

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

uhm in de constructor toch wel :?

.edit: yup, in de constructor wel :)
hint voor de topicstarter

.edit2: en dat noemt zich nou een Sun Certified Java Programmer (of wat was het?) ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Maar het moet toch mogelijk zijn om eenmalig een berekening te maken en de uitkomst als final te declareren? Dat is wat ik moet doen.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
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 :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
rubenski: Maar het moet toch mogelijk zijn om eenmalig een berekening te maken en de uitkomst als final te declareren? Dat is wat ik moet doen.
Tuurlijk kan dat niet ;) . Maar gelukkig is het ook niet wat je moet doen.

Een waarde kan nooit final zijn. Het is onzinnig om een waarde final te maken. Een waarde verandert namelijk nooit. Variabelen, die veranderen wel. Je kunt een variabele een nieuwe waarde geven. Daarom kan je variabelen dus wel final maken. Een variabele mag dan geen nieuwe waarde krijgen.

Je moet in je methode echter gewoon de waarde van een final variabele opleveren. De uitleg die ik net boven poste zou je een heel eind de goede weg op moeten helpen en is bovendien een oplossing waar je een mooi cijfer mee haalt :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
OiSyN: uhm in de constructor toch wel :?

yup, in de constructor wel :)
Mwah, je kunt een final variabele voor het eerst een waarde geven in een constructor. Je mag hem daarna echter ook in deze constructor niet meer van waarde veranderen (hoop ik).

Dit is eigenlijk best wel verwarrend omdat een final variabele nu op meerdere plekken een waarde kan krijgen.

In C# is dit wat wellicht wat duidelijk gedaan met de 'readonly' en 'const' modifiers.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 03 januari 2002 02:18 schreef mbravenboer het volgende:

[..]

Tuurlijk kan dat niet ;)
Tuurlijk kan dat wel ;)
code:
1
2
3
4
5
6
7
8
9
class Blaat
{
    public final static int blaatWaarde = blaatFunc ();

    private static int blaatFunc ()
    {
      return (int)(Math.random () * Integer.MAX_VALUE);
    }
}

en dan heb je een mooie final static variabele die elke keer als je je applicatie opstart een andere waarde bevat (ik zeg hierbij niet dat dit goed gebruik is van final static) :)

Overigens heb ik rubenski niet over static horen praten (vandaar ook mijn eerdere opmerking over die constructor)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Uhm ik heb die opdracht eens gelezen, en ik vraag me af of die vent uberhaupt wel weet waar ie mee bezig is :?

Een verhaaltje over constanten en nog meer geblaat, en dan een stukje code met final erin, en die variabelen zijn niet eens static!

Hoe verbruik ik geheugen, les 1 :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Zal wel didactisch correct zijn he :Y)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
OiSyN: Tuurlijk kan dat wel ;)
Allemachtig, heb jij bijdehandjes gegeten? :P .

Het kan niet en is ook onzinnig. Een waarde is een waarde. Een int 6 is 6 en kan niet veranderen in 5. Het resultaat van een functie is een waarde. Het resultaat van een functie kan dus niet final zijn. Wel kan je als resultaat van een functie de waarde van een final variabele opleveren.
en dan heb je een mooie final static variabele die elke keer als je je applicatie opstart een andere waarde bevat
Juist ja, je hebt dus een final variable :+ .

Over de opgave: het is inderdaad erg vaag. Al eens over een andere opleiding ( UU 8-) gedacht? ) ;) .
code:
1
2
3
4
5
final int DAGEN_JANUARI  = 31
final int DAGEN_FEBRUARI = 28
 .......
final int DAGEN_NOVEMBER = 30
final int DAGEN_DECEMBER = 31

Sinds wanneer is het aantal dagen in Februari een constante: 28? Veel beter kan je hier met speciale klassen werken voor Maanden, Jaren etc. Je kunt dan in deze klassen methoden opnemen om het aantal dagen van een bepaalde maand te verkrijgen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 03 januari 2002 02:47 schreef mbravenboer het volgende:

[..]

Allemachtig, heb jij bijdehandjes gegeten? :P .
wacht even...
Het kan niet en is ook onzinnig. Een waarde is een waarde. Een int 6 is 6 en kan niet veranderen in 5. Het resultaat van een functie is een waarde. Het resultaat van een functie kan dus niet final zijn. Wel kan je als resultaat van een functie de waarde van een final variabele opleveren.
We weten allebei dat rubenski niet op de uitkomst doelde, maar dat ie gewoon een final variabele wilde met een bepaalde waarde (de uitkomst van een berekening), dus WIE is hier nou bijdehand :+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
OiSyN: We weten allebei dat rubenski niet op de uitkomst doelde, maar dat ie gewoon een final variabele wilde met een bepaalde waarde (de uitkomst van een berekening)
Owh ja.... hum.... das waar... :o . Ik had z'n verhaal niet goed genoeg uitgeplozen ;) .

Maar goed, dat verandert nog niets aan m'n verhaal :P . Hij kan gewoon een "final boolean isZomertijd" maken en deze een waarde geven door de static methode in TijdRegelingsPeriode aan te roepen en het resultaat te vergelijken met de twee mogelijke waarden. Als het een final-instantie variabele is (onzinnig) kan dat in de constructor, als het een static variable is, kan dat in het static initializatie block van een klasse.

Al met al is er dus nog steeds geen waarde die final is >:) ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1