Korzystanie z ArrayList wewnątrz kilku klas

0

Witam wszystkich
Proszę o poradę, czy istnieje jakiś przyjęty sposób na wykorzystanie List w klasach w Javie, czy sposób w jaki ja to robię jest poprawny? Chodzi o to, że mam klasę, w której znajduje się lista elementów innej klasy, a w tej klasie kolejna lista elementów kolejnej klasy.

Docelowo w poszczególnych elementach klas będą zapisywane informacje z pliku CSV. Proszę o sugestie co tutaj ewentualnie można (a nawet trzeba) pozmieniać.

Kod programu testowego przedstawiam poniżej:

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

public class Osiedle 
{
	List<Blok> bloki;
	
	public void start()
	{
		bloki = new ArrayList<Blok>();
		
		bloki.add(new Blok());
		
		bloki.get(0).numerBloku=1;
		bloki.get(0).liczbaKlatek=5;
		bloki.get(0).liczbaMieszkan=12;
		
	//	bloki.get(0).mieszkanie = new ArrayList<Mieszkanie>();   <-- zamiast tego tworzona jest lista w konstruktorze klasy Blok
		bloki.get(0).mieszkanie.add(new Mieszkanie());
		bloki.get(0).mieszkanie.get(0).pietro=1;
		bloki.get(0).mieszkanie.get(0).numerMieszkania=10;
		bloki.get(0).mieszkanie.get(0).powierzchnia=60.5;
		
	//	bloki.get(0).mieszkanie.get(0).lokator=new ArrayList<Lokator>();   <-- zamiast tego tworzona jest lista w konstruktorze klasy Mieszkanie
		bloki.get(0).mieszkanie.get(0).lokator.add(new Lokator());
		bloki.get(0).mieszkanie.get(0).lokator.get(0).imie="Hieronim";
		bloki.get(0).mieszkanie.get(0).lokator.get(0).nazwisko="Kopytko";
		bloki.get(0).mieszkanie.get(0).lokator.add(new Lokator());
		bloki.get(0).mieszkanie.get(0).lokator.get(1).imie="Rzepicha";
		bloki.get(0).mieszkanie.get(0).lokator.get(1).nazwisko="Kopytko";
		
		bloki.get(0).mieszkanie.add(new Mieszkanie());
		bloki.get(0).mieszkanie.get(1).pietro=1;
		bloki.get(0).mieszkanie.get(1).numerMieszkania=11;
		bloki.get(0).mieszkanie.get(1).powierzchnia=55.5;
		
	//	bloki.get(0).mieszkanie.get(1).lokator=new ArrayList<Lokator>();    <-- zamiast tego tworzona jest lista w konstruktorze klasy Mieszkanie
		bloki.get(0).mieszkanie.get(1).lokator.add(new Lokator());
		bloki.get(0).mieszkanie.get(1).lokator.get(0).imie="Bonifacy";
		bloki.get(0).mieszkanie.get(1).lokator.get(0).nazwisko="Osiołek";
		bloki.get(0).mieszkanie.get(1).lokator.add(new Lokator());
		bloki.get(0).mieszkanie.get(1).lokator.get(1).imie="Kunegunda";
		bloki.get(0).mieszkanie.get(1).lokator.get(1).nazwisko="Osiołek";
		
		
		System.out.println(bloki.get(0).toString());
		
		System.out.println(bloki.get(0).mieszkanie.get(0).toString()+"Lokatorzy mieszkania to "
				+bloki.get(0).mieszkanie.get(0).lokator.get(0).toString()+" oraz "+bloki.get(0).mieszkanie.get(0).lokator.get(1).toString()+".");
		System.out.println(bloki.get(0).mieszkanie.get(1).toString()+"Lokatorzy mieszkania to "
				+bloki.get(0).mieszkanie.get(1).lokator.get(0).toString()+" oraz "+bloki.get(0).mieszkanie.get(1).lokator.get(1).toString()+".");

	}
	
	public static void main(String[] args) 
	{
		Osiedle os = new Osiedle();
		os.start();			
	}

}


class Blok 
{
 public int numerBloku;
 public int liczbaKlatek;
 public int liczbaMieszkan;
 
 public List<Mieszkanie> mieszkanie;
 
 public Blok()
 {
	 mieszkanie = new ArrayList<Mieszkanie>();
 }
 
 public String toString()
 {
	 return "Blok nr "+numerBloku+" ma "+liczbaKlatek+" klatek i "+liczbaMieszkan+" mieszkań. ";
 }
}

class Mieszkanie
{
 public int pietro;
 public int numerMieszkania;
 public double powierzchnia;
 
 public List<Lokator> lokator;
 
 public Mieszkanie()
 {
	 lokator = new ArrayList<Lokator>();
 }
 
 
 public String toString()
 {
	 return "Mieszkanie nr "+numerMieszkania+" ma powierzchnię "+powierzchnia+"m2 i znajduje się na "+pietro+" piętrze. ";
 }
}

class Lokator
{
	public String imie;
	public String nazwisko;
	
	public String toString()
	{
		return imie+" "+nazwisko;
	}


/*

Wynik działania programu:

Blok nr 1 ma 5 klatek i 12 mieszkań. 
Mieszkanie nr 10 ma powierzchnię 60.5m2 i znajduje się na 1 piętrze. Lokatorzy mieszkania to Hieronim Kopytko oraz Rzepicha Kopytko.
Mieszkanie nr 11 ma powierzchnię 55.5m2 i znajduje się na 1 piętrze. Lokatorzy mieszkania to Bonifacy Osiołek oraz Kunegunda Osiołek.

*/

}
1

Używaj konstruktorów.

0

Dziękuję za sugestię, kod poprawiony. Konstruktory zrobiły dobrą robotę. Nie podoba mi się jeszcze to "get(int index)" ale czy z tym da się coś zrobić?

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

public class Osiedle {
	List<Blok> bloki;

	public void start() {
		bloki = new ArrayList<Blok>();

		bloki.add(new Blok(1,5,12));

		bloki.get(0).mieszkanie.add(new Mieszkanie(1,10,60.5));		
		bloki.get(0).mieszkanie.get(0).lokator.add(new Lokator("Hieronim","Kopytko"));
		bloki.get(0).mieszkanie.get(0).lokator.add(new Lokator("Rzepicha","Kopytko"));
		bloki.get(0).mieszkanie.get(0).lokator.add(new Lokator("Onufry","Kopytko"));

		bloki.get(0).mieszkanie.add(new Mieszkanie(1,11,55.5));
		bloki.get(0).mieszkanie.get(1).lokator.add(new Lokator("Bonifacy","Osiołek"));
		bloki.get(0).mieszkanie.get(1).lokator.add(new Lokator("Kunegunda","Osiołek"));
		bloki.get(0).mieszkanie.get(1).lokator.add(new Lokator("Genowefa","Osiołek"));
		
		System.out.println(bloki.get(0).toString());

		System.out.println(bloki.get(0).mieszkanie.get(0).toString() + "Lokatorzy mieszkania to "
				+ bloki.get(0).mieszkanie.get(0).lokator.get(0).toString() + ", "
				+ bloki.get(0).mieszkanie.get(0).lokator.get(1).toString() + " oraz "
				+ bloki.get(0).mieszkanie.get(0).lokator.get(2).toString() + ".");
		System.out.println(bloki.get(0).mieszkanie.get(1).toString() + "Lokatorzy mieszkania to "
				+ bloki.get(0).mieszkanie.get(1).lokator.get(0).toString() + ", "
				+ bloki.get(0).mieszkanie.get(1).lokator.get(1).toString() + " oraz "
				+ bloki.get(0).mieszkanie.get(1).lokator.get(2).toString() + ".");

	}

	public static void main(String[] args) {
		Osiedle os = new Osiedle();
		os.start();
	}

}

class Blok {
	public int numerBloku;
	public int liczbaKlatek;
	public int liczbaMieszkan;

	public List<Mieszkanie> mieszkanie;

	public Blok() {
		numerBloku=1;
		liczbaKlatek=1;
		liczbaMieszkan=1;
		mieszkanie = new ArrayList<Mieszkanie>();
	}
	
	public Blok(int numerBloku,int liczbaKlatek,int liczbaMieszkan) 
	{
		this.numerBloku=numerBloku;
		this.liczbaKlatek=liczbaKlatek;
		this.liczbaMieszkan=liczbaMieszkan;
		mieszkanie = new ArrayList<Mieszkanie>();
	}

	public String toString() {
		return "Blok nr " + numerBloku + " ma " + liczbaKlatek + " klatek i " + liczbaMieszkan + " mieszkań. ";
	}
}

class Mieszkanie {
	public int pietro;
	public int numerMieszkania;
	public double powierzchnia;

	public List<Lokator> lokator;

	public Mieszkanie() {
		pietro=1;
		numerMieszkania=10;
		powierzchnia=50.5;
		lokator = new ArrayList<Lokator>();
	}
	
	public Mieszkanie(int pietro,int numerMieszkania,double powierzchnia) 
	{
		this.pietro=pietro;
		this.numerMieszkania=numerMieszkania;
		this.powierzchnia=powierzchnia;
		lokator = new ArrayList<Lokator>();
	}

	public String toString() {
		return "Mieszkanie nr " + numerMieszkania + " ma powierzchnię " + powierzchnia + "m2 i znajduje się na "
				+ pietro + " piętrze. ";
	}
}

class Lokator {
	public String imie;
	public String nazwisko;

	public Lokator()
	{
		imie="Anonim";
		nazwisko="Anonimowy";
	}
	
	public Lokator(String imie,String nazwisko)
	{
		this.imie=imie;
		this.nazwisko=nazwisko;
	}
	
	public String toString() {
		return imie + " " + nazwisko;
	}
}
1

To co robisz to jakieś szaleństwo i hardkor. Używaj metod klas a nie takich cudów na kiju! Niech klasa Blok ma metody związane z blokiem i TYLKO na tych metodach operujesz. Zewnętrzna klasa ma w ogóle nie wiedzieć co siedzi w tym bloku. Widzisz TYLKO metody.

edit:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

class BlockOfFlats{
    private final List<Flat> flats = new ArrayList<>();
    private final int numberOfFlats;
    private final int staircases;
    private final int blockNumber;

    BlockOfFlats(int numberOfFlats, int staircases, int blockNumber) {
        this.numberOfFlats = numberOfFlats;
        this.staircases = staircases;
        this.blockNumber = blockNumber;
    }

    public void addFlat(Flat m){
        flats.add(m);
    }

    public String toString(){
        return getDescription()+flats.stream()
                .map(Object::toString)
                .collect(Collectors.joining("\n"));
    }

    private String getDescription() {
        return "Blok nr " + blockNumber + " ma " + staircases + " klatek i " + numberOfFlats + " mieszkań.\n";
    }
}

class Flat{
    private final List<Tenant> tenants = new ArrayList<>();
    private final int flatNumber;
    private final int surface;
    private final int floor;

    Flat(int flatNumber, int surface, int floor) {
        this.flatNumber = flatNumber;
        this.surface = surface;
        this.floor = floor;
    }

    public void addTenant(Tenant t){
        tenants.add(t);
    }

    public String getDescription(){
        return "Mieszkanie nr " + flatNumber + " ma powierzchnię " + surface + "m2 i znajduje się na "
                + floor + " piętrze.\n";
    }

    public String toString(){
        return getDescription()+tenants.stream()
                .map(Object::toString)
                .collect(Collectors.joining(", oraz ", "Lokatorzy mieszkania to: ","."));
    }

}


class Tenant{
    private final String name;
    private final String surname;

    Tenant(String name, String surname) {
        this.name = name;
        this.surname = surname;
    }

    @Override
    public String toString() {
        return name+" "+surname;
    }
}

public class Mieszkania {
    public static void main(String[] args){
        BlockOfFlats blok = new BlockOfFlats(5, 2, 1);
        Flat one = new Flat(1, 50, 3);
        one.addTenant(new Tenant("Jan", "Kowalski"));
        one.addTenant(new Tenant("Janina", "Kowalska"));
        blok.addFlat(one);
        Flat two = new Flat(2, 48, 2);
        two.addTenant(new Tenant("Zbigiew", "Nowak"));
        two.addTenant(new Tenant("Grażyna", "Nowak"));
        two.addTenant(new Tenant("Nina", "Nowak"));
        blok.addFlat(two);

        System.out.println(blok);
    }
}

I teraz wszystkie operacje specyficzne dla mieszkania umieszczasz w Mieszkaniu, dla Bloku w Bloku a dla Mieszkańca w Mieszkańcu. Dzieki temu jak zrobisz mieszkanie.Wyburz() to ta klasa automatycznie najpierw wywoła na każdym mieszkaniu mieszkanie.opróżnij() które to zawoła dla każdego swojego mieszkańca mieszkaniec.wyprowadźSię() ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1