Typ enum

Odpowiedz Nowy wątek
2017-03-31 09:13
0

Mam kilkanaście klas X1, X2.. XN, w każdej jest zdefiniowany publiczny typ enum (nazwa typu enum jest taka sama w tych klasach, np. SortTyp, wartości są różne). Dodatkowo wszystkie te klasy X1..XN są dziedziczone z tego samego przodka.

W jaki sposób zaimplementować parametr jakiejś metody jako jeden z tych kilkunastu typów enum, po to aby dalej w tej metodzie wykonać pętlę po wszystkich pozycjach danego enum ?
Poniżej przykład dla konkretnej klasy, ja potrzebuję aby parametrem metody był typ enum jednej z tej kilkunastu klas X1...XN

//definicja metody
public String findEnum(X1.SortTyp sort) {

    //pętla po wszystkich polach X1.SortTyp

}
ktoś coś przekombinował... - spartanPAGE 2017-03-31 09:16

Pozostało 580 znaków

2017-03-31 09:18
0

Zapytanie: "java loop over enum"
Pierwsza odpowiedź:

http://stackoverflow.com/ques[...]-iterate-over-an-enum-in-java

Z tego co piszą po prostu użyj X1.SortTyp.values() w for-each.


Szacuje się, że w Polsce brakuje 50 tys. programistów
edytowany 1x, ostatnio: vpiotr, 2017-03-31 09:18
Dzięki, ale podstawowy problem, to jak napisać metodę, która nie oczekuje konkretnego typu czyli X1.SortTyp, a jednego z możliwych typów z klas od X1 do XN - wemibo 2017-03-31 09:21
użyj int-a :) a tak na serio to chyba masz coś nie tak z designem. - vpiotr 2017-03-31 09:24

Pozostało 580 znaków

2017-03-31 09:29
1

Enum, to w uproszczeniu klasa która posiada kilka zdefiniowanych singletonów. I tak może np. implementować interfejs. Jeżeli więc będą implementować interfejs:

import java.util.Arrays;
import java.util.List;

enum X1 implements EnumGroupElement<X1>{
    V1,
    V2;

    @Override
    public List<Enum<X1>> groupValues() {
        return Arrays.asList(values());
    }

}

enum X2 implements EnumGroupElement<X2>{
    V2,
    V3,
    V4;

    @Override
    public List<Enum<X2>> groupValues() {
        return Arrays.asList(values());
    }
}

interface EnumGroupElement<T extends Enum<T>> {
    List<Enum<T>> groupValues();
}

I wykonanie:

public void foo(EnumGroupElement<?> enumGroupElement){
   List<? extends Enum<?>>  enumGroup = enumGroupElement.groupValues(); //Lista wszystkich wartości danego enum
   ...
}

Zauważ że X1.V2 != X2.V2

edytowany 1x, ostatnio: krzysiek050, 2017-03-31 09:34
Dziękuję, wyskakują mi 2 błędy: 1) w wierszu 'public List<Enum<x1>> groupValues() {' - The method groupValues() of type X1 must override a superclass method, 2) w wierszu return Arrays.asList(values()); - Type mismatch: cannot convert from List<x1> to List<Enum<x1>> - wemibo 2017-03-31 10:15
Pokaż cały kod klasy. - krzysiek050 2017-03-31 10:16

Pozostało 580 znaków

2017-03-31 10:27
0

1) Utworzyłem interfejs (oddzielny plik EnumGroupElement.java) :

package pl.iz.table;
import java.util.List;

public interface EnumGroupElement <T extends Enum<T>> {
    List<Enum<T>> groupValues();
}

2) W mojej istniejącej klasie (nazwa pliku TblComplaintSort.java),
'''
public class TblComplaintSort extends TblBaseSort<compldto> {
'''

dodałem:

    public enum X1 implements EnumGroupElement<X1>{
        V1,
        V2;

        @Override
        public List<Enum<X1>> groupValues() {
            return Arrays.asList(values());
        }

    }

Pozostało 580 znaków

2017-03-31 10:43

Trochę pokręciłem z pamięci. Tutaj masz kod który sprawdziłem :P.


import java.util.Arrays;
import java.util.List;

public class Main {

    public static void main(String... args) {
        System.out.println("-X1-");
        printAllFromGroup(X1.V2);

        System.out.println("-X2-");
        printAllFromGroup(X2.V2);

    }

    public static void printAllFromGroup(EnumGroupElement<?> enumGroupElement) {
        List<? extends Enum<?>> enumGroup = enumGroupElement.groupValues(); //Lista wszystkich wartości danego enum
        enumGroup.forEach(e -> System.out.println(e.name()));
    }
}

enum X1 implements EnumGroupElement<X1>{
    V1,
    V2;

    public List<X1> groupValues() {
        return Arrays.asList(values());
    }
}

enum X2 implements EnumGroupElement<X2>{
    V2,
    V3,
    V4;

    public List<X2> groupValues() {
        return Arrays.asList(values());
    }
}

interface EnumGroupElement<T extends Enum<T>> {
    List<T> groupValues();
}

OUTPUT

-X1-
V1
V2
-X2-
V2
V3
V4
edytowany 1x, ostatnio: krzysiek050, 2017-03-31 10:44
Dzięki wielkie. Działa OK. - wemibo 2017-03-31 11:46

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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