Enums und Vererbung

Cola_Colin

Top Contributor
Hi,
gegeben folgendes Enum:
Java:
	public enum Product {
		client(1), server(2);
		private Product(int i) {
			id = i;
		}
		private int id;
		
		public int getId() {
			return id;
		}
		
		public static Product byId(int id) {
			for (Product p: values()) {
				if (p.getId() == id) {
					return p;
				}
			}
			throw new IllegalArgumentException("unknown id");
		}
	}

Ich habe noch eine Reihe weitere solcher Enums, alle mit einem byId(int id). Die Methode sieht immer gleich aus und es wäre toll, sie in eine Basisklasse auszulagern. Aber enums können nur Interfaces implementieren. Mein Versuch ein Interface mit getId() zu machen und eine statische Hilfsmethode zu schreiben scheitert daran, dass ich dann auf values nicht zugreifen kann.

Eine Lösung per Reflection geht:
Java:
	@SuppressWarnings("unchecked")
	private static <T> T getById(Class<T> t, int id) {
		try {
			Method values = t.getMethod("values");
			Method getId = t.getMethod("getId");
			for (T x: (T[])values.invoke(null)) {
				if (((Integer)getId.invoke(x)) == id) {
					return x;
				}
			}
			throw new IllegalArgumentException();
		} catch (Exception ex) {
			throw new RuntimeException(ex);
		}
	}

Aber geht das auch ohne diesen Umweg und eventuell als Instanzmethode von den Enums?
 

Gregorrr

Bekanntes Mitglied
Nicht wirklich die Lösung, es müssten alle Enums in einem gruppiert werden müssten:
Java:
public enum Product {

        CLIENT(1) {
            int myMethod() { return 123; }
        },

        SERVER(2) {
            int myMethod() { return 432; }
         };

        private int id;

        private Product(int id) {
            this.id = id;
        }

        public int getId() {
            return id;
        }

        abstract int myMethod();
        
        public static Product byId(int id) {
            for (Product p: values()) {
                if (p.getId() == id) {
                    return p;
                }
            }
            throw new IllegalArgumentException("unknown id");
        }
    }
 

Cola_Colin

Top Contributor
Hmm ja, das Problem, dass ich nicht an values() rankomme bleibt. values scheint nicht in Enum definiert zu sein, sondern taucht von irgendwo auf, wenn man enums definiert?!
Beispiel:
Java:
public class EnumStuff {
	
	public interface GetId {
		int getId();
	}
	
	public static <T extends Enum<T> & GetId> T getById(T clazz, int id) {
		// kein zugriff auf values ...
	}
	
	public enum Product implements GetId{
		client(1), server(2);
		
		private Product(int id) {
			this.id = id;
		}
		
		private int id;

		@Override
		public int getId() {
			return id;
		}
	}
	
	public enum PaymentType implements GetId {
		weekly(0), monthly(1), yearly(2);
		
		private PaymentType(int id) {
			this.id = id;
		}
		
		private int id;
		
		@Override
		public int getId() {
			return id;
		}
	}
}
 
S

SlaterB

Gast
Reflection im ersten Post ist unnötig, wie gesagt wurde, gehen doch Interface?
für das Enum-Array gibt es gar eine feste Class-Methode, values() per Reflection ist unschön
Java:
public class Test {
    public static void main(String[] args)  {
        getById(Product2.class,4); // geht nicht, kein Enum
        getById(Product.class,4);
    }

    private static <T extends Enum & A>T getById(Class<T> t, int id)  {
        for (T x : t.getEnumConstants())     {
            if (x.getId() == id)  {
                return x;
            }
        }
        return null;
    }
}


interface A {
    public int getId();
}

class Product2  implements A {
    public int getId()  {
        return 0;
    }
}


enum Product implements A {
    client(1), server(2);
    private Product(int i)   {
        id = i;
    }

    private int id;

    public int getId()  {
        return id;
    }

}

----

wenn die natürlich vergebenen Ids der Enums helfen, 0, 1, 2, 3, .oridinal(),
dann gar direkt der Index im Enum-Array,


-----

@Gregorrr
der Sinn für eine abstrakte Methode ist hier nicht ganz erkennbar, sollen die verschieden implementiert werden können?
wenn nur ein jeweils anderer Wert zurückgegeben wird, reicht normale Methode + Attribut, Wert im Konstruktor,
wie vollkommen parallel für Id ja vorgemacht daneben steht
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Vererbung bei enums ? Allgemeine Java-Themen 3
M Enums zum ersten mal Allgemeine Java-Themen 15
F Enums als innere Klasse sinnvoll? Allgemeine Java-Themen 3
C Vergleich von Enums gibt inkorrekte Werte Allgemeine Java-Themen 6
D prüfen, ob Enums bestimmte Elemente enthalten Allgemeine Java-Themen 3
D Enums subclassen / erweitern? Allgemeine Java-Themen 2
GilbertGrape Eine Art Basisklasse für Enums Allgemeine Java-Themen 9
G Typensicherheit bei enums Allgemeine Java-Themen 4
T enums - eigener startwert Allgemeine Java-Themen 5
V Enums aus Datei-Einträgen erzeugen? Allgemeine Java-Themen 6
S Methode die Enums verarbeiten kann? Allgemeine Java-Themen 2
F Frage zu switch und enums Allgemeine Java-Themen 5
B Enums hinzufügen Allgemeine Java-Themen 6
M enums ineinander schachteln Allgemeine Java-Themen 10
S Enums - statischer import Allgemeine Java-Themen 2
U Vererbung?! Allgemeine Java-Themen 15
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
MiMa Vererbung und Komposition?? Allgemeine Java-Themen 38
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
W Generics + Vererbung Allgemeine Java-Themen 47
M Vererbung mithilfe von Bluej Allgemeine Java-Themen 3
M List -Tableview-Javafx-Vererbung Allgemeine Java-Themen 35
A Vererbung Selbstreferenzparameter Allgemeine Java-Themen 14
D Thema: Vererbung Ober-/Unterklassen Allgemeine Java-Themen 16
D Frage zu Vererbung Allgemeine Java-Themen 5
N Vererbung mit GUI Allgemeine Java-Themen 9
E Vererbung Countable mit Vererbung Allgemeine Java-Themen 6
J 2 Fragen zur Vererbung Allgemeine Java-Themen 5
T Javaklassen und vererbung Allgemeine Java-Themen 32
F Vererbung Allgemeine Java-Themen 5
Neumi5694 Vererbung Restriktive Vererbung Allgemeine Java-Themen 4
A Vererbung Übungsaufgabe Vererbung - Erstellung Klassenhierarchie Allgemeine Java-Themen 1
J Allgemeine Fragen zu Vererbung Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
D Problem bei Vererbung abstrakter Klassen Allgemeine Java-Themen 6
D Object nach Vererbung mit Class Object überprüfen Allgemeine Java-Themen 4
T Super Klasse Vererbung Problem :/ Allgemeine Java-Themen 10
L Unabhängige Auslieferung bei Vererbung Allgemeine Java-Themen 20
S MVC - Vererbung Allgemeine Java-Themen 4
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
D Unterschied Vererbung und Polymorphie? Allgemeine Java-Themen 4
K Vererbung ohne Basisklasse zu kennen Allgemeine Java-Themen 20
Da_Tebe ArrayList<xyz> Verschachtelung oder Vererbung? Allgemeine Java-Themen 6
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
M OOP PropertyChangeListener - Vererbung oder Komposition? Allgemeine Java-Themen 5
S OOP Mehrfache Vererbung von abstrakten Klassen Allgemeine Java-Themen 7
G Designfrage Vererbung ja oder nein Allgemeine Java-Themen 9
S equals - Identität ändern bei Vererbung? Allgemeine Java-Themen 5
dayaftereh Vererbung Hilfe Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
A PropertyChangeListener Vererbung Allgemeine Java-Themen 4
P DefaultTreeCellRenderer Vererbung Allgemeine Java-Themen 5
S Objekte die Objekte enthalten: Keine Vererbung Allgemeine Java-Themen 4
J Vererbung bei abstrakten Klassen Allgemeine Java-Themen 2
S Vererbung: Welche Methode wird verwendet? Allgemeine Java-Themen 9
L Checkstyle: Wann ist eine Methode für Vererbung entworfen? Allgemeine Java-Themen 13
S normale vererbung als interface Allgemeine Java-Themen 2
S statische Methoden und Vererbung Allgemeine Java-Themen 6
R Vererbung - doppelte Paint-Methode Allgemeine Java-Themen 4
R Vererbung mit Interface und Abstract Allgemeine Java-Themen 3
W Frage zu Vererbung / konkretes Beispiel Allgemeine Java-Themen 4
F Vererbung von SessionBeans Allgemeine Java-Themen 3
O abstract, privat, Vererbung Allgemeine Java-Themen 29
L Annotations mit Vererbung Allgemeine Java-Themen 4
M Singleton und Vererbung? Allgemeine Java-Themen 45
T Problem mit Vererbung Allgemeine Java-Themen 3
V Vererbung und Schleifen Allgemeine Java-Themen 5
C Comparable + Vererbung Funktioniert nicht? Allgemeine Java-Themen 4
A Ansatz Objektorientierung, Methoden Vererbung Allgemeine Java-Themen 2
D Listen von Generischen Typen inkl. Vererbung Allgemeine Java-Themen 2
D Zugriffsmethode nach Vererbung ändern? Allgemeine Java-Themen 5
S Vererbung in UML Allgemeine Java-Themen 3
T Nochmal Frage zu Vererbung Interfaces etc. Allgemeine Java-Themen 10
Y Gedanken zur Vererbung Allgemeine Java-Themen 7
F Vererbung, Generizität und Collections. Allgemeine Java-Themen 7
G Frage zu statischen Variablen bei Vererbung Allgemeine Java-Themen 15
F Vererbung Allgemeine Java-Themen 5
S Vererbung von mehreren Klassen? Allgemeine Java-Themen 5
C enum und Vererbung Allgemeine Java-Themen 3
K Problem mit Vererbung - Kein wirklicher Nutzen. Allgemeine Java-Themen 10
G vererbung vs benutzung Allgemeine Java-Themen 7
L Vererbung klappt nicht Allgemeine Java-Themen 5
W Probleme mit Arrays und Vererbung ! Allgemeine Java-Themen 5
M vererbung einer "selbst-instanzierungs-klasse" Allgemeine Java-Themen 16
J Vererbung. Allgemeine Java-Themen 8
H Frage zur Vererbung Allgemeine Java-Themen 5
S private Instanzvaribalen bei "Innerer-Vererbung" Allgemeine Java-Themen 9
H Vererbung auch ohne erzeugung einer Instanz möglich? Allgemeine Java-Themen 3
M frage zur vererbung Allgemeine Java-Themen 12
G Generics und Vererbung. Allgemeine Java-Themen 21
M Vererbung von Hashtables Allgemeine Java-Themen 5
C dynamische Vererbung Allgemeine Java-Themen 6

Ähnliche Java Themen


Oben