import java.io.*; /** Yksinkertainen luokka, joka vastaa dynaamisesti kasvavaa int-taulukkoa, * ja joka osaa serialisoidan itsensä yhtä tehokkaasti kuin kiinteän * kokoinen taulukko. */ public class IntList implements Serializable { // Taulukko, johon luvut viedään. private int[] nums = new int[8]; // Ensimmäisen käyttämättömän alkion indeksi. private transient int size = 0; /** Palauttaa taulukon alkion */ public int elementAt(int index) throws ArrayIndexOutOfBoundsException { if (index >= size) throw new ArrayIndexOutOfBoundsException(index); else return nums[index]; } /** Lisää taulukkoon int-luvun ja kasvattaa taulukkoa jos tarvitsee */ public void add(int x) { // Kasvatetaan taulukkoa if (nums.length == size) resize(nums.length*2); nums[size++] = x; // Talletetaan int-luku. } /** Sisäinen metodi, jolla muutetaan taulukon kokoa */ protected void resize(int newsize) { int[] oldnums = nums; nums = new int[newsize]; // Luodaan uusi taulukko. System.arraycopy(oldnums, 0, nums, 0, size); // Kopioidaan taulukon } // alkiot. /** Hankkiudutaan eroon käyttämättömistä alkioista ennen serialisointia */ private void writeObject(ObjectOutputStream out) throws IOException { if (nums.length > size) resize(size); // Tiivistetään taulukko. out.defaultWriteObject(); // Ja kirjoitetaan se sitten } // normaalisti. /** Lasketaan tarnsientin size-kentän arvo sen jälkeen kun olio on *palautettu. */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); // Luetaan taulukko. size = nums.length; // Annetaan arvo taulukon koolle. } }