Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo ich habe ein kleines Problem, da ich zum ersten mal mit enum Klassen arbeite und auch nach Recherche wenig gefunden habe dachte ich ich frage mal hier.
Ich habe in meiner enum Klasse welchen einen Filter darstellt
folgende Operation:
Java:
public Collection<Entry> filter(Collection<Entry> entries) {
final ArrayList<Entry> result = new ArrayList<Entry>();
for (Entry e: entries) {
switch(this.ordinal()) {
case 1:
// Male with an age of 18 years or more and phone number contact information
if ((e.isMale() && e.getAge() >= 18 && e.getContactInformation() instanceof PhoneNumber))
result.add(e);
break;
case 2:
// Female with a surname of either "Duck" or "Maus" and an age of 30 or more years
if (e.isFemale() && (e.getSurName().equalsIgnoreCase("Duck") || e.getSurName().equalsIgnoreCase("Maus") && e.getAge() >= 30))
result.add(e);
break;
case 3:
// People with a last name that starts with the letter D, which are either female or of an age of less than 18 or 65 and more
if ((e.isFemale() || e.getAge() < 18 || e.getAge() >= 65 && e.getSurName().startsWith("D")))
result.add(e);
break;
default: return entries;
}
}
return result;
}
}
Nun wollte ich diese aus einer anderen Klasse ganz normal aufrufen allerdings scheint das mit enum nicht so einfach möglich zu sein wie mit einer normalen Klasse. Hat da jemand vielleicht Tipps für mich was ich anders machen müsste?
Das sollte eigentlich kein Problem sein, zeig doch mal die ganze Klasse und auch den Aufruf den du versuchst.
Java:
switch(this.ordinal())
Sowas sollte man übrigens vermeiden!
Änderst du (oder jemand anderes) mal die Reihenfolge der Enums dann funktioniert plötzlich nichtsmehr wie gewohnt und man ist da lange am rätseln.
Du kannst diese Methode direkt an das Enum hängen, und dann so aufrufen:
Sowas sollte man übrigens vermeiden!
Änderst du (oder jemand anderes) mal die Reihenfolge der Enums dann funktioniert plötzlich nichtsmehr wie gewohnt und man ist da lange am rätseln.
Du kannst diese Methode direkt an das Enum hängen, und dann so aufrufen:
[...]
Die EikeB's Weg ist der richtige. Gehe wie folgt vor:
Definiere Dir zunächst ein Interface Filter<E>
Java:
public interface Filter<E> {
public boolean accept(E element);
}
Lasse Deine enum dieses Interface implementieren, indem Du die Methode bei jeder Enum-Konstante so schreibst, wie Du sie haben möchtest:
Java:
public enum EntryFilter implements Filter<Entry> {
ADULT {
public boolean accept(Entry entry) {
return entry.getAge >= 18;
}
},
MAN {
public boolean accept(Entry entry) {
return element.isMale && ADULT.accept(entry);
}
},
WOMAN{
public boolean accept(Entry entry) {
return !element.isMale && ADULT.accept(entry);
}
},
BOY{
public boolean accept(Entry entry) {
return element.isMale && !ADULT.accept(entry);
}
},
GIRL {
public boolean accept(Entry entry) {
return !element.isMale && !ADULT.accept(entry);
}
};
}
Definiere die filter-Methode wie folgt:
Java:
public class FilterUtil {
public static <E> Collection<E> doFilter(Collection<E> elements, Filter<E> filter) {
final ArrayList<E> result = new ArrayList<E>();
for (E element: elements) {
if(filter.accept(element) {
result.add(element);
}
}
return result;
}
}
Nutzen tust Du es dann so:
Java:
// entres ist irgendeine Collection mit entries (woher auch immer die kommt)
Collection<Entry> men = FilterUtil.doFilter(enties, EntryFilter.MAN);
P.S. Der von Dir gewählte Klassenname "Entry" ist etwas unglücklich. Offensichtlich handelt es sich hier ja um Personen oder allgemeiner um etwas, dass ein Alter und ein Geschlecht hat. Es würden sich also bessere Klassennamen anbieten, z.B. "Person" oder "Creature" oder sowas. Dementsprechend wäre Deine enum dann auch ein "EntryFilter" mehr, sondern ein "PersonFilter". Das ist dann schon sehr viel sprechender.
public static <E> Collection<E> doFilter(Collection<E> elements, Filter<E> filter) {
final ArrayList<E> result = new ArrayList<E>();
for (E element: elements) {
if(filter.accept(element) {
result.add(element);
}
}
return result;
}
Komisch. Ich hab auch schon generische Klassen und Methoden entwickelt, die sahen aber anders aus. Vermutlich weil ich mich auf den Typ, der in der Klassendefinition oben hinterlegt war, bezogen habe.
Diese Methode ist statisch, da ist der Unterschied zu "normalen" Verwendung dieser Parameter. Im statischen Kontext gibt es ja keinen Bezug zu einer Typbindung innerhalb einer Instanz.