You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

Tilstand for oppførselens skyld

Et objekt har både tilstand (attributter) og oppførsel (metoder), og vekten på det ene eller andre aspektet kan variere. Noen ganger er fokuset på oppførsel, hvor tilstanden primært er utformet for å støtte implementasjon av oppførselen. Denne siden presenterer tre kode-eksempler som er ment å illustrere dette.

MinValueHelper - ønsket oppførsel

MinValueHelper-objekter skal kunne ta i mot ett og ett (desimal)tall og hele tiden kunne svare på hva som er hittil minste tall. Nye tall gis inn ved å kalle nextNumber(double) og minste tall kan hentes ut med metoden getMinValue(). Dette er en beskrivelse av oppførselen til objektet, siden det bare er metodene som er nevnt. Det er underforstått at objektene må ha en tilstand, men det er et åpent spørsmål hvilken tilstand som trengs for å støtte implementasjonen av ønsket oppførsel.

MinValueHelper - hvilken tilstand trengs?

For å holde rede på hittil minste tall, trenger en bare å huske nettopp det: hittil minste tall. En trenger ikke huske alle tallene. Det hittil minste tallet kan f.eks. lagres i en variabel vi kaller minValue. (Det er en konvensjon i Java, at dersom en metode heter getEtEllerAnnet og en skal lagre dette EtEllerAnnet, så kaller man variabelen etEllerAnnet.) Hver gang nextNumber kalles, så sjekker vi om det nye tallet er mindre enn hittil minste tall, altså minValue, og i tilfelle så setter vi minValue til det nye tallet.

Her er først versjon av koden (derfor kaller vi den MinValueHelper1):

package stateandbehavior;

public class MinValueHelper1 {

    double minValue;
    
    void nextNumber(double value) {
        if (value < minValue) {
            minValue = value;
        }
    }

    double getMinValue() {
        return minValue;
    }

    public static void main(String[] args) {
        MinValueHelper1 minValueHelper = new MinValueHelper1();
        System.out.println(minValueHelper.getMinValue());
        minValueHelper.nextNumber(3);
        System.out.println(minValueHelper.getMinValue());
        minValueHelper.nextNumber(5);
        System.out.println(minValueHelper.getMinValue());
        minValueHelper.nextNumber(1);
        System.out.println(minValueHelper.getMinValue());
    }
}

Nederst har vi lagt inn en main-metode som kan brukes for å teste MinValueHelper1-klassen. (Denne main-metoden kan forsåvidt ligge i en annen klasse, men det er mest praktisk å legge den her, selv om det egentlig ikke er meningen at denne klassen skal være et kjørbart program i vanlig forstand.). Kjør klassen (altså main-metoden) og se hva som skjer!

Du vil fort oppdage at programmet ikke virker etter hensikten, fordi getMinValue() hele tiden returnerer 0! Hvordan kan det ha seg? Svaret er at minValue automatisk blir initialisert til 0.0, som er default-verdien for double-typen. (default-verdien er den verdien som gis til variabler som ikke bli initialisert når de deklareres, og er false, 0, 0.0 og null for henholdsvis boolean, int, double og objekt-typer). Dermed er denne hele tiden minst, og minValue blir aldri endret.

Vi kan håndtere dette på flere måter, f.eks.

  • Vi kan velge en startverdi for minValue som er størst mulig, slik at første tall er nødt til å bli notert som nytt minste tall. For double-typen er dette Double.MAX_VALUE, så deklarasjonen blir da double minValue = Double.MAX_VALUE.
  • Vi kan velge en spesiell startverdi som tegn på at minValue egentlig ikke er satt ennå. Men i motsetning til objekt-typer som har null-verdien, finnes det ingen gyldig tall-verdi som betyr "ingen verdi", så dette er en dårlig løsning.
  • Vi kan introdusere en egen variabel som sier om minValue er eksplisitt satt. Denne variablen vil starte som false og så settes til true, første gang nextNumber kalles.

Her velger vi den siste løsningen (selv om den første er enklest), fordi den illustrerer bruken av logiske verdier. Her er koden:

package stateandbehavior;

public class MinValueHelper2 {

    double minValue;
    boolean isMinValueSet = false;
    
    void nextNumber(double value) {
        if (! isMinValueSet) {
            minValue = value;
            isMinValueSet = true;
        } else if (value < minValue) {
            minValue = value;
        }
    }

    double getMinValue() {
        return minValue;
    }
    
    public static void main(String[] args) {
        MinValueHelper2 minValueHelper = new MinValueHelper2();
        System.out.println(minValueHelper);
        minValueHelper.nextNumber(3);
        System.out.println(minValueHelper);
        minValueHelper.nextNumber(5);
        System.out.println(minValueHelper);
        minValueHelper.nextNumber(1);
        System.out.println(minValueHelper);
    }
}
  • No labels