Sprawdzanie obiektu w switchu?

0

Dzień dobry,
Chciałbym się spytać odnośnie switch'a.
Czy jest możliwe abym w warunek wrzucił obiekt (jego toString jest napisany) i sprawdził czy jest on taki jak mój String w case?
Czyli rozchodzi się o:

switch (obj) {
    case tak: System.out.println("tak.");
    break;
    case nie: System.out.printlny("nie.");
    break;
}

Chodzi mi konkretnie o taki zapis. Czy w tym obiekcie powinienem jakoś inaczej przekazywać wartość do sprawdzenia w switchu?

0

tzn chcesz sprawdzić jakiego typu masz obiekt po prostu?

1

Jeśli chodzi Ci konkretnie o taki przypadek, to z tego co rozumiem coś takiego:

 
System.out.println(obj.ToString() + ".");
0

http://ideone.com/FmLwmI
Tylko czemu nie zrobić jednym wierszem: System.out.println(obj+".");

0

Enum jest rozwiązaniem do mojego problemu. Mógłby ktoś tylko powiedzieć w jaki sposób mogę odwołać się do pola z "listy" enum jeśli muszę zwrócić konkretny obiekt? Najłatwiej byłoby napisać obj.cosZenum ale ja mam zwracać tylko dany obiekt i program oczekuje w tym miejscu danego pola do switch'a. Miałby ktoś może pomysł?

0

A chyba wiem o co Ci chodzi.
Jeśli podany przez Ciebie przykład jest faktycznym problemem, to odpowiedź już dostałeś, jak zrobić to poprawnie.

Jeśli faktycznie żądasz czegoś jak domyślna metoda, to raczej czegoś takiego nie znajdziesz.
Skoro i tak masz mieć konkretną metodę, to czemu nie chcesz jej wywołać? Jeśli możesz dostawać obiekty różnych typów to przecież masz rzutowanie, dziedziczenie itd.

Może opisz dokładniej FAKTYCZNY problem.

0

Może pokażę to na przykładzie, możliwe że to jest prostsze niż myślę.

Mój wcześniejszy switch:

switch (obj.getInnyObiekt) {
    case tak: System.out.println("tak.");
    break;
    case nie: System.out.printlny("nie.");
    break;
}

Chodzi o to, że przy tworzeniu "obj" powstaje w konstruktorze inny obiekt, zupełnie innej klasy której argumentem jest moje pole z enuma. Chciałbym teraz aby ta metoda zwróciła mi wartość enuma i wpasowała się do switch'a. Jeśli jednak moja metoda getInnyObiekt zwraca obiekt to nie mogę się odwołać do pola z tego obiektu. Tak przynajmniej mówi mój kompilator.

0

Rozwiązania widzę dwa i obydwa chyba takie sobie.

  1. Jak tworzysz w konstruktorze ten inny obiekt, dajmy na to:
UberObject obj = new UberObject(MyObjects.subObject); //MyObjects.subObject to wartość Twojego enuma, może robisz to inaczej
 

to w konstruktorze poza tworzeniem tego drugiego obiektu, przypisz odpowiedniego enuma do tej twojej klasy, którą nazwałem UberObject. (obiektem tej klasy jest Twój obiekt: obj).
A potem:

switch(obj.GetObjectType())
{
...
}

I wtedy GetObjectType zwraca Ci to, co przypisałeś w konstruktorze. Druga opcja, chyba lepsza, jest taka, że tworzysz sobie klasę bazową dla tych wszystkich klas, które tworzysz później w konstruktorze. Klasa bazowa ma mieć:

prywatne pole z typem Twojego enuma
publiczną: GetObjectType(), która zwraca tego enuma. W konstruktorze tej innej klasy ustawiasz odpowiednio tego enuma. A potem:

switch(obj.getInnyObiekt().GetObjectType())
{
...
}

Jednak bardziej niezawodnym rozwiązaniem jest posłużenie się RTTI. Pewnie w Javie jakieś jest, coś w stylu:

if(obj.getInnyObiekt() is FantastycznaKlasa)
{

}
else...

Oczywiście to się robi brzydkie, można zrobić mechanizm, który Ci to zamieni na jakieś enumy.
Ale przede wszystkim zastanów się, czy nie projektujesz źle programu i faktycznie to potrzebujesz. Bo być może wystarczy odpowiednio zaprojektować interfejsy i klasy bazowe i potem po nich dziedziczyć.

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