2011. március 18., péntek

Kódértelmezési példa

Egy pici elgondolkodtató feladat egy interjúról:

Tyre.java:

public class Tyre {

    private int size;

    Tyre(int s) {
        size = s;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

}

Car.java:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Car {

    private List<Tyre> tires = new ArrayList<Tyre>();

    public void setTires(List<Tyre> tires) {
        this.tires.clear();
        this.tires.addAll(tires);
    }

    public void addTire(Tyre tire) {
        this.tires.add(tire);
    }

    public List<Tyre> getTires() {
        return Collections.unmodifiableList(tires);
    }

}

CarTest.java:

import java.util.List;

public class CarTest {

    /**
     * Question: what will be the output?
     */
    public static void main(String[] args) {
        Car car = new Car();
        car.addTire(new Tyre(10));
        car.addTire(new Tyre(11));

        List<Tyre> carTires = car.getTires();
        System.out.println("Before: " + carTires.size());
        car.setTires(carTires);
        System.out.println("After (1): " + car.getTires().size());
        System.out.println("After (2): " + carTires.size());
    }

}

Kérdés: Mi lesz a kimenete a programnak?

7 megjegyzés:

  1. 2,0,0

    public void setTires(List tires) {
    this.tires.clear();
    this.tires.addAll(tires);
    }

    a clear()-el a tire is ürítve lett...
    így az addall(tires) már nincs mit hozzáadjon

    VálaszTörlés
    Válaszok
    1. Kicsit pontosítva: a clear()-el a paraméterként kapott "List tires" is ürítve lett, mivel az az eredeti this.tires-ra hivatkozik.

      Törlés
    2. Nem értek egyet! A this.tires.clear() az instance változójár(listáját) tette üressé, majd a paraméterként kapott listával újra tölti. Valójában a clear()-re és az add-ra se lenne szükség. Pusztán egyenlővé kéne tenni a kapot paraméterrel --> this.tires = tires;

      Törlés
    3. A Car osztályban, a getTires()-ből hiányzik a List-ré castolás.

      Törlés
    4. Mikor próbálom futtatni, az alábbi hibaüzenetet kapom:

      java.lang.ClassCastException: java.util.Collections$UnmodifiableCollection cannot be cast to java.util.List
      at car.Car.getTires(Car.java:20)
      at car.CarTest.main(CarTest.java:11)

      Törlés
  2. Ezt a megjegyzést eltávolította a szerző.

    VálaszTörlés
  3. Ezt a megjegyzést eltávolította a szerző.

    VálaszTörlés