ArrayList wyjątek

0

Witam, w mojej klasie PrisonCell znajduje się lista więźniów którzy w niej przebywają. Chciałbym aby w każdej celi mieściło się MAX 4 więźniów. Czy istnieje sposób aby ograniczyć wprowadzanie większej liczby wyjątkiem?

public class PrisonCell {

    private static ArrayList<Prisoner> array = new ArrayList<Prisoner>(4);


    void AddPrisonerToCell(Prisoner prisoner) {

        array.add(prisoner);

    }
}
1
void AddPrisonerToCell(Prisoner prisoner) {
       if(array.size()==4){
         throw new IllegalArgumentException("Max 4 wiezniow");
       
       }
        array.add(prisoner);
 
    }
 
0

Lub opakowanie rozwiązania @ShermanMg w value object.


public class PrisonCell {

    private PrisonerList array = new PrisonerList(4);


    void AddPrisonerToCell(Prisoner prisoner) {

        array.add(prisoner);

        /**
         * if(array.canAddPrisoner()){
         *      array.add(prisoner);
         * }
         *  else{
         *      do something else
         *  }
         *
         */
    }
}

class PrisonerList {

    private ArrayList<Prisoner> array;
    private int size;

    public PrisonerList(int size) {
        this.size = size;
        this.array = new ArrayList<Prisoner>(size);
    }

    void add(Prisoner prisoner) {
        if(array.size()==size){
            throw new IllegalArgumentException("Max "+size+" wiezniow");

        }
        array.add(prisoner);
    }

    boolean canAddPrisoner(){
        return arrau.size()<size;
    }

}

BTW, jeżeli chcesz żeby w każdej z osobna celi mieściło się 4 więźniów to lista musi być właściwością obiektu a nie klasy. Czyli static, dla Twojej array jest błędny.

0

@maggy24, to Twój pomysł by korzystać z wyjątków, czy takie dostałeś polecenie? Jeśli to Twój pomysł to z niego zrezygnuj - korzystanie z wyjątków jest kosztowne, kontrole możesz łatwo zrobić bez użycia wyjątków.

    boolean add(Prisoner prisoner) {
        if(array.size() == size){
            return false;
        }
        array.add(prisoner);
        return true;
    }
0
bogdans napisał(a):

@maggy24, to Twój pomysł by korzystać z wyjątków, czy takie dostałeś polecenie? Jeśli to Twój pomysł to z niego zrezygnuj - korzystanie z wyjątków jest kosztowne, kontrole możesz łatwo zrobić bez użycia wyjątków.

    boolean add(Prisoner prisoner) {
        if(array.size() == size){
            return false;
        }
        array.add(prisoner);
        return true;
    }

czemu kosztowne, moglbys to rozwinac?

0

@bogdans, absolutnie się z Tobą nie zgadzam, nie ucz ludzi złych wzorców. Korzystanie z wyjątków nie jest aż tak kosztowne, żeby było priorytetem. A że optymalizuje się tylko wąskie gardła, to nie widzę żadnego uzasadnienia do niekorzystania z wyjątków poza kilkoma krytycznymi miejscami w aplikacji.
Dlaczego korzystać z wyjątków, a nie statusów? Wyobraź sobie, że w każdym miejscu, gdzie korzystasz z metody która zwraca status zamiast rzucać wyjątkiem, musisz sprawdzać i obsługiwać ten status. Masz np. pięć takich wywołań w jednej metodzie i każde przykrywasz takim lub podobnym pseudokodem status = metoda(); if (status != OK) return status;. Jak to wpływa na czytelność kodu? Co się stanie, jeśli w którymś miejscu zapomnisz sprawdzić zwrócony status? Co jeśli metoda oprócz statusu ma zwrócić wynik obliczeń albo jakiś model? Jak dowiesz się kilka poziomów stosu wywołań niżej (np. w loggerze), która konkretnie metoda się nie powiodła?
Tymczasem obsługa wyjątku może być jedna, niezależnie od tego, która metoda z całego drzewka wywołań się wywaliła. Ponadto wyjątek gwarantuje, że kod nie wykona się dalej w normalny sposób, nawet jeśli zapomnisz o tym, że metoda taki wyjątek rzuca. Całą pulę wyjątków możesz obsłużyć w jednym miejscu, tj. wywołujesz wcześniej wspomniane pięć metod, nie musisz wyniku każdej z nich obsługiwać w osobnym try/catch z returnem tylko robisz jeden catch, w nim logujesz treść wyjątku i rzucasz wyjątkiem dalej. Jedno miejsce, bez dodatkowych if'ów, bez dodatkowych modeli i bez parametrów przekazywanych przez referencję. W skrajnym przypadku do obsługi wyjątków wystarczy jeden globalny handler i podczepiony do niego logger. Kod jest krótszy i bardziej czytelny, trudniej popełnić błąd.
Minister zdrowia ostrzega: używanie statusów zamiast wyjątków może spowodować raka.

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