Wpis z mikrobloga

#programowanie #java

Cześć,

Aktualnie mam 3 klasy enum: ssak, ptak, ryba i w każdym z nich mam wymienione zwierzęta należące do każdej z grup. Tych enuma używam w konstruktorze, ale bezsensu jest mieć 3 enumy i w każdym konstruktorze dla ssaka ryby i ptaka jest inny enum. Jest możliwość zrobić jednego enuma o wartościach ssak, ptak ryba i z tych wartości wybierać ponownie? coś na zasadzie:

public enum AnimalTypeEnum

{

Mammal(tutaj wymieniam sobie typy)

Bird(tutaj wymieniam sobie typy)

Fish(tutaj wymieniam sobie typy)

}

Dzięki za pomoc :)
  • 26
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@pulla: Musisz sobie zdefiniować konstruktor, który to by przyjął. O ile dobrze pamiętam, chyba nie można przeładowywać konstruktorów, ale spróbuj.
  • Odpowiedz
@nocnyMark: Tak buduje zoo

@japer: A to nie będzie tak, że w konstruktorze przypisze tylko jedną domyślną wartość a np. taki Bird będzie ich kilka a nie mogę zrobić Bird("bird1"), Bird("bird2")
  • Odpowiedz
@pulla: Bo enum jest relacji jeden element-jedna wartość. Nie da się zrobić dwóch Birdów, bo to wskazuje na dwuznaczność użycia. :D
  • Odpowiedz
@Yahoo_: Takie coś odpada. Mam 3 enum typy Mammal, Bird, Fish. I mam 3 klasy dla każdego gatunku i dla odpowiedniego gatunku używam enuma, więc jak będę chciał dodać nowe zwierze do ssaka to dodam sobie je tylko w enumie.
  • Odpowiedz
więc jak będę chciał dodać nowe zwierze do ssaka to dodam sobie je tylko w enumie.


@pulla: "Tylko w enumie" oznacza, że musisz od nowa kompilować kod itd. Jak rozumiem to kod na studia i masz to pewnie w dupie, ale ogólnie takie podejście nie jest raczej zgodne z dobrymi praktykami.
  • Odpowiedz
@pulla: Ja bym zostawił tylko enuma z gromadami, a gatunki (oczywiście z przypisaną gromadą) wczytywałbym z pliku/bazy obojętnie - z jakiegoś zewnętrznego źródła. Wtedy, żeby dodać gatunek nie musiałbyś w ogóle kodu zmieniać. Ogólnie zastanawiam się co Ty dalej z tymi zwierzętami chcesz robić? Bo w Twoim podejściu średnio widzę możliwość, żeby zwierzaki czymkolwiek się od siebie różniły (poza gromadą). Raczej nie chcesz w kodzie baboli typu:

if(animal.AnimalType == Mammal.Lion)
  • Odpowiedz
@Yahoo_: @msgreen: Co do pierwszej części to nie jest to trochę sztuka dla sztuki? pobierać z osobnego źródła? Jak wezmę tylko w enumie sobie dopisze kolejny podgatunek np. ssaka i mogę sobie stworzyć kolejnego zwierza.

A z tym if nie wiedziałem, że to jest zła praktyka, chociaż nie zamierzałem tego stosować. Raczej typ zwierzęta będzie potrzebny mi do np. wkładania ich do odpowiednich klatek. A tworzę to po
  • Odpowiedz
@pulla: Nie to nie jest sztuka dla sztuki - przynajmniej nie w większych projektach. Dużo łatwiej jest dopisać jedną linijkę w pliku konfiguracyjnym niż rozszerzać enuma i budować kod od nowa.

Jak chcesz poćwiczyć OOP to proponuję, żeby każdy gatunek był osobnym zwierzakiem (to też nie jest idealne podejście, ale na tę chwilę styknie).

np. coś
  • Odpowiedz
Jak masz klase abstrakcyjna ktora ma wszystkie metody abstrakcykne to lepiej zrobic z niej interfejs z tego wzgledu,ze dziedziczyc mozesz tylko po kednej klasie w Javie, a interfejsow mozesz implementowac wiele.
  • Odpowiedz
@Yahoo_: @msgreen: Tak w zasadzie miałem wcześniej zrobione, że animal był klasą abstrakcyjną i reszta gatunków po nim dziedziczyła, ale właśnie jedna rzecz mnie martwiła. Mianowicie jak mam klase animal później kolejne klasy to gatunek no i ostateczna klasa to będzie już podgatunek czyli taki lion. Teraz jak będę chciał dopisać kolejne zwierzę to muszę tworzyć nowa klasę np. wolf. A w zasadzie wolf i lion będą identycznymi
  • Odpowiedz
@pulla: Trochę, ale to lepsze podejście niż to co wykombinowałeś (gdzie zwierzęta się niczym nie różnią albo masz wielkie bloki switch case/ if else). Wszystko zależy co chcesz osiągnąć. Masz jakieś wymagania co do projektu, co mają robić zwierzaki itd.?
  • Odpowiedz