Keresés

Új hozzászólás Aktív témák

  • WonderCSabo

    félisten

    válasz Lacces #3298 üzenetére

    A Java mindenhol referenciákat használ (kivéve a primitív típusokat, de itt most nincs olyan). Feltételezem a car.getTires() fv. car.tires listát adja vissza. Mivel referenciákról van szó, ekkor a main lokális változója, a carTires illetve a car.tires mező ugyanarra az objektumra fog mutatni. Ezután átadod a car.setTires(carTires) - el a carTirest, ami törli a belső saját listát. De a carTires is a belső listára mutat, tehát ugyanazt a listát törlöd ki! Ezután hozzáadod a belső listához ugyannak a már üres listának az elemeit, nyilván továbbra is üres marad.

    Ez egy ismert jelenség, és direkt kitaláltak rá olyan mintákat, amivel ezt el lehet kerülni. Az egyik ilyen megoldás a defensive copy.

    [ Szerkesztve ]

  • TBG

    senior tag

    válasz Lacces #3298 üzenetére

    Az egészet nem értem egyébként.

    Car car = new Car();
    car.addTire(new Tyre(10));
    car.addTire(new Tyre(11));

    Ez a 3 sor megcsinálja azt, amit itt szeretnél tenni...

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

    Gondolom, azt vártad, hogy lesz egy 4 elemű listád [10,11,10,11] értékekkel? Vagy mi volt az elképzelés?
    Egyébként így működött volna:

    public class Car {

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

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

    // Egyéb lekérdező metódusok
    }
    public class CarTest {

    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 anotherCar = new Car();
    anotherCar.setTires(carTires);
    System.out.println("After (1): " + car.getTires().size());
    System.out.println("After (2): " + anotherCarTires.size());
    }

    [ Szerkesztve ]

    ZTE Grand X powered by Intel® Atom™, Eladó: Panasonic HC-V10 HD+16GB SD kártya 25K.

Új hozzászólás Aktív témák