Emme edelleenkään ole ottaneet kantaa siihen, mitä tapahtuu, jos joku yrittää alustaa oliomme mielettömillä arvoilla, esimerkiksi:
Aika a1 = new Aika(42,175);
Toisaalta miten joku voisi muuttaa ajan arvoa muutenkin kuin lisaa-metodilla? Teemmekin aluksi metodin aseta, jota kutsuttaisiin
a1.aseta(12,15); a2.aseta(16,23);
Nyt pitää kuitenkin päättää mitä tarkoittaa laiton asetus! Jos sovimme että minuuteissa yli 59 arvot ovat aina 59 ja alle 0:n arvot ovat aina 0, voisi aseta-metodi olla kirjoitettu seuraavasti:
public void aseta(int ih,int im) { h = ih; m = im; if ( m > 59 ) m = 59; if ( m < 0 ) m = 0; }
Jos taas haluaisimme, että ylimääräinen osuus siirtyisi tunteihin, voitaisiinkin tämä tehdä "kierosti" lisaa-metodin avulla
... public class Aika4 { private int h=0, m=0; /** * Asettaa uuden ajan ja pitää huolen että aika on aina oikeaa muotoa. * @param h asetettavat tunnit * @param m asetettavat minuutit */ public void aseta(int h,int m) { this.h = h; this.m = m; lisaa(0); } public Aika4() { // Oletusmuodostaja aseta(0,0); } /** * Alustaa ajan niin että minuutit ovat aina 0 * @param h tunnit */ public Aika4(int h) { aseta(h,0); } public Aika4(int h,int m) { // Muodostaja aseta(h,m); } public void tulosta() {... public void lisaa(int lisa_min) { ... public static void main(String[] args) { Aika4 a1 = new Aika4(); Aika4 a2 = new Aika4(13); Aika4 a3 = new Aika4(14,25); a1.tulosta(); a2.tulosta(); a3.tulosta(); a1.aseta(12,15); a2.aseta(16,-15); a1.tulosta(); a2.tulosta(); } }
Huomattakoon, että samalla kun tehdään aseta-metodi, kannattaa muodostajassakin kutsua sitä. Näin olion tilaa muutetaan vain muutamassa metodissa, jotka voidaan ohjelmoida niin huolella, ettei mitään yllätyksiä pääse koskaan tapahtumaan. Tämä rupeaa jo muistuttamaan olio-ohjelmointia!