EnumSet erweitern ...

Status
Nicht offen für weitere Antworten.

boesi

Aktives Mitglied
moin

Ich möchte die Klasse EnumSet um eine Methode
Java:
boolean containsAny(Collection<E> c)
erweitern - irgendein Element aus c soll im Set vorhanden sein. Und das natürlich möglichst ohne EnumSet komplett neu zu implementieren.

Tja die Frage ist nun: Wie geht man/frau da am besten vor?

Ich hab mir da natürlich schon ein paar Gedanken zu gemacht - bin aber im Moment der Meinung, das geht mit der 2. Bedingungen nicht. Meine Gedanken werde ich in einem 2. Posting schreiben - jetzt will ich erstmal eine Diskussion lostreten ... (wenn denn jemand mit diskutieren will ;))


cu boesi

PS: ja ich weiß so wirklich "Anfänger"-tauglich ist das Thema nicht, aber zumindest für mich sehr "Basics"
 

byte

Top Contributor
Mach Dir doch einfach eine Util Funktion dafür: [c]static boolean containsAny(Collection<E> c, EnumSet<E> set)[/c]
 

boesi

Aktives Mitglied
Mach Dir doch einfach eine Util Funktion dafür: [c]static boolean containsAny(Collection<E> c, EnumSet<E> set)[/c]
Das wäre natürlich möglich und wird wohl praktisch auch darauf hinaus laufen - aber hey wir sind doch hier in einer strikt objektorientieren Welt mit Vererbung und all diesem Quatsch ... ;)
 
S

SlaterB

Gast
List ist ein Interface und es gibt zig verschiedene Listen,
niemand würde von allen erben wollen um dort die Sortierung einzeln einzubauen
->
Collections.sort(list)

steht nicht die Aggregation noch über der Vererbung?
 

boesi

Aktives Mitglied
List ist ein Interface und es gibt zig verschiedene Listen,
niemand würde von allen erben wollen um dort die Sortierung einzeln einzubauen
->
Collections.sort(list)

steht nicht die Aggregation noch über der Vererbung?
Ich bin in UML nicht ganz fit, deswegen hilf mir doch mal bitte auf die Sprünge, wie du hier auf Aggregation kommst. Die Enum-Konstanten sind zwar Teil des EnumSets und daher liegt hier wohl eine Aggregation vor - aber was hat das mit der gewünschten Funktion containsAny zu tun? Wäre das nicht eher eine Spezialisierung bzw eine Erweiterung? Dass das nicht geht, liegt ja an der konkreten Implementierung von EnumSet.

Ob die Funktion sort nun direkt in das Interface List oder zB SortedList gehört oder in eine Hilfsklasse als statische Methode - darüber kann man beliebig lang streiten - aber immerhin ist die Klasse Collections konsequent umgesetzt. Aber genau diese Konsequenz würde meiner Hilfsmethode containsAny fehlen - was ist denn der Unterschied zwischen containsAll und containsAny?


cu boesi
 
B

bygones

Gast
was ist denn der Unterschied zwischen containsAll und containsAny?
bei all muessen alle elemente vorhanden sein bei any reicht es wenn mind. 1

was Slater meinte ist dass
Java:
public class MyList {
    private OtherClass theClass;
}
vorzuziehen gegenueber
Java:
public class MyList extends OtherClass {
}
ist

edit: wobei ich zugeben muss dass ich seinen Post mit deiner Frage nicht ganz in Zusammenhang bekomme ;-)
 

boesi

Aktives Mitglied
bei all muessen alle elemente vorhanden sein bei any reicht es wenn mind. 1
Das ist mir schon klar - ich hab ja die Bedeutung von containsAny selbst definiert. Worauf ich eigentlich hinaus wollte: Warum soll es für den Programmierer, der containsAll und containsAny verwenden würde, logisch sein, dass die Art des Aufrufs sich unterscheidet. Ich muß ja schließlich auch an die Wartbarkeit meines Codes denken ...

was Slater meinte ist dass
Java:
public class MyList {
    private OtherClass theClass;
}
vorzuziehen gegenueber
Java:
public class MyList extends OtherClass {
}
ist

edit: wobei ich zugeben muss dass ich seinen Post mit deiner Frage nicht ganz in Zusammenhang bekomme ;-)
Wobei ein derartiger Wrapper* durchaus eine Lösung sein könnte ... *denkpause* ... verdammt nein das würde auch nicht einfach so funktionieren - weil noneOf Objekte erzeugt, die vom orginalen EnumSet abgeleitet sind und meine Methode containsAny wieder nicht enthalten würden. Ich müßte also doch Teile von EnumSet neuimplementieren.

* um mal einen Begriff aus dem Bereich der Entwurfsmuster zu verwenden, ist für mich deutlich näher an der praktischen Lösung von Problemen des Programmieralltags als UML


cu boesi
 

boesi

Aktives Mitglied
bevor ich meine Gedanken zu diesem Thema wiedergebe: Wieso
ist einzige Constructor von EnumSet protected? Das verhindert effektiv, dass ich EnumSet selbst implementieren kann.

Hier nun meine etwas ausführliche Analyse dieser Geschichte: EnumSet ist eine abstrakte Klasse mit einer Reihe von statischen Factory-Methoden, die ein konkretes Objekt der Klasse erzeugen. Dazu gibt's noch eine ganze Reihe von Methoden, die von den abgeleiteten Klassen implementiert werden müssen. Interessant ist die Methode
Java:
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType)
Diese liefert abhängig von der Größe des Enum-Universiums ein Objekt einer Klasse, die wiederum EnumSet implementiert.

Bezüglich der Objektorientierung seh ich hier mindestens 2 Brüche:
  1. EnumSet kennt die Klassen, die von ihr abgeleitet sind.
  2. Ich kann EnumSet nicht selbst implementieren, ohne meine neue Klasse in das Package java.util zu stellen. Überhaupt erschließt sich mir der Sinn von protected Konstrukturen bei einer abstrakten Klasse nicht wirklich.
Meine gewünschte Methode containsAny kann man nun von 2 Seiten aus betrachten:
  1. Wenn man sich den Objektbaum vorstellt, will ich quasi zwischen EnumSet und den konkreten Implementierungen eine weitere Klasse einschieben. Es ist offensichtlich, dass das nicht geht. In Java sowieso nicht und auch sonst ist der Gedanke eher merkwürdig.
  2. Ich will doch EnumSet einfach nur um eine Methode erweitern. Dass EnumSet unterschiedliche Implementierungen verwendet, weiss ich als Anwender der Klasse doch gar nicht (und soll ich ja auch nicht wissen).
 
S

SlaterB

Gast
> verdammt nein das würde auch nicht einfach so funktionieren - weil noneOf Objekte erzeugt, die vom orginalen EnumSet abgeleitet sind

das gilt genauso für eine SubKlasse, spricht also nicht gegen einen Wrapper

> Bezüglich der Objektorientierung seh ich hier mindestens 2 Brüche:
>
> 1. EnumSet kennt die Klassen, die von ihr abgeleitet sind.
> 2. Ich kann EnumSet nicht selbst implementieren,

man könnte behaupten, dass 1 und 2 zusammengehören ;)
manche Dinge soll man in Java eben nicht erweitern, String ist final, hier hat man diesen Trick verwendet,
Enums sind ebenso begrenzt
 
Zuletzt bearbeitet von einem Moderator:
B

bygones

Gast
EnumSet kennt die Klassen, die von ihr abgeleitet sind
ist nicht unbedingt schlecht... wie du schon sagst sind es Factory methoden, die dem Aufrufer unwissend lassen was fuer eine Implementierung nun genau dahinter steckt - was fuer ihn ja auch voellig uninteressant ist, hauptsache es ist ein EnumSet

Ich kann EnumSet nicht selbst implementieren, ohne meine neue Klasse in das Package java.util zu stellen. Überhaupt erschließt sich mir der Sinn von protected Konstrukturen bei einer abstrakten Klasse nicht wirklich.
weil man eben verhindern will dass die Klasse ausserhalb des packages instanziert werden kann bzw vererbt werden kann. Enkapselung ist ein enorm starkes und wichtiges Element in einem guten Design
 

boesi

Aktives Mitglied
ist nicht unbedingt schlecht... wie du schon sagst sind es Factory methoden, die dem Aufrufer unwissend lassen was fuer eine Implementierung nun genau dahinter steckt - was fuer ihn ja auch voellig uninteressant ist, hauptsache es ist ein EnumSet


weil man eben verhindern will dass die Klasse ausserhalb des packages instanziert werden kann bzw vererbt werden kann. Enkapselung ist ein enorm starkes und wichtiges Element in einem guten Design
Jetzt werd ich mal polemisch: Kapselung oder jedes andere Konzept zum Selbstzweck ist ein Zeichen für verdammt schlechtes Design.

Letztendlich vermischt EnumSet die beiden Konzepte Factory und Interface, dabei sollten die eigentlich wie zB bei BorderFactory und dem Interface Border klar getrennt sein.
 

boesi

Aktives Mitglied
Off Topic:

In einer vernünftigen Sprache löst man solche Probleme so: Pimp my Library.
Scala ist definitiv eine der interessantesten Sprachen, die in den letzten Jahren so erschienen sind. Wenn nur die geschweiften Klammern nicht wären und die Doppelpunkte an der richtigen Stelle. Dafür ist das Fehlen von Semikolons eine wahre Wohltat :toll:

Aber da ich aktuell auf Java festgenagelt bin und das Ding hier Java-forum.org heißt, führt das tatsächlich am Thema vorbei. Also gib's noch Lösungsansätze in Java?
 

boesi

Aktives Mitglied
hae ? was ? sorry versteh ich nicht..

natuerlich muss groovy installiert sein und java ....
Eh ich Groovy installier, nehm ich lieber gleich Scala (oder noch lieber Python). Aber wie schon gesagt, steht mir in meiner praktischen Arbeit leider weder das eine noch das andere zur Verfügung. Aber ich will trotzdem Klassen erweitern, will die Standardbibliothek um Funktionen erweitern, die sich genau wie die bereits vorhandenen nutzen lassen uswusf.

Und da bleibt wohl nur eine Portierung nach Plain Old Java ...
 
B

bygones

Gast
ich muss sagen ich versteh immer noch nicht warum du unbedingt enumset neu implementieren willst
Java:
public class RR<E extends Enum<E>> {
    private final EnumSet<E> _set;

    public RR(EnumSet<E> set) {
        _set = set;
    }

    public boolean containsAny(Collection<E> collection) {
        for (E e : collection) {
            if (_set.contains(e)) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        RR<Foo> r = new RR<Foo>(EnumSet.of(Foo.bar));
        List<Foo> list = new ArrayList<Foo>();
        System.out.println(r.containsAny(list));
        list.add(Foo.bar);
        System.out.println(r.containsAny(list));
    }

    enum Foo {
        foo, bar
    }
}
 

boesi

Aktives Mitglied
ich muss sagen ich versteh immer noch nicht warum du unbedingt enumset neu implementieren willst
Das will ich ja gerade nicht. Ich will einfach nur eine Methode containsAny, die sich genau wie containsAll verwenden läßt. Warum ich das will?
1. Weil sich
Java:
if (this.avaiable.contains(PrintFunctions.SURVEY) || this.avaiable.contains(PrintFunctions.ZERTIFIKAT) ||
				this.avaiable.contains(PrintFunctions.RESULTS) || this.avaiable.contains(PrintFunctions.SKILLS)||
				this.avaiable.contains(PrintFunctions.JOBS) || this.avaiable.contains(PrintFunctions.CONSULTING)) {
echt beschissen liest und 2.
Java:
if (this.avaiable.containsAll(EnumSet.of(PrintFunctions.VORLAGE, PrintFunctions.SURVEY)) { ...
} else if (Helper.containsAny(this.avaiable, EnumSet.of(PrintFunctions.RESULTS, PrintFunctions.SKILLS))) {
noch viel schlimmer ist.
 
Zuletzt bearbeitet:
B

bygones

Gast
fakt ist - es geht nicht... ergo bleibt dir nur Delegation uebrig oder wie byto schrieb eine utility
 

byte

Top Contributor
Das will ich ja gerade nicht. Ich will einfach nur eine Methode containsAny, die sich genau wie containsAll verwenden läßt. Warum ich das will?
1. Weil sich
Java:
if (this.avaiable.contains(PrintFunctions.SURVEY) || this.avaiable.contains(PrintFunctions.ZERTIFIKAT) ||
				this.avaiable.contains(PrintFunctions.RESULTS) || this.avaiable.contains(PrintFunctions.SKILLS)||
				this.avaiable.contains(PrintFunctions.JOBS) || this.avaiable.contains(PrintFunctions.CONSULTING)) {
echt beschissen liest.
und 2.
Stand ja auch nie zur Debatte...

Ich finde, diesen beiden Varianten lesen sich genau gleich gut:

Java:
if (EnumUtils.containsAny(available, Arrays.asList(PrintFunctions.SURVEY, PrintFunctions.ZERTIFIKAT, ...)) {
  // blub
}
Java:
if (available.containsAny(Arrays.asList(PrintFunctions.SURVEY, PrintFunctions.ZERTIFIKAT, ...)) {
  // blub
}
 
S

SlaterB

Gast
oder auch
Java:
if (EnumUtils.containsAny(available, PrintFunctions.SURVEY, PrintFunctions.ZERTIFIKAT, ...) {
  // blub
}
mit einem ...-Parameter

edit: wie ihn sonst Arrays.asList natürlich verwenden würde ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K EnumSet als (bitmaskierter) Int Java Basics - Anfänger-Themen 9
S Viele Konstanten, EnumSet? Java Basics - Anfänger-Themen 3
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
Poppigescorn Arrayliste Mittels Scanner erweitern Java Basics - Anfänger-Themen 6
J GroupLayout zur Laufzeit erweitern Java Basics - Anfänger-Themen 1
B Array bei jeder Eingabe um eins erweitern Java Basics - Anfänger-Themen 3
JD_1998 Vorgegebene Methode erweitern um Hex -> Dezimal umzuwandeln Java Basics - Anfänger-Themen 1
V Array aus Klasse um vererbte Elemente erweitern Java Basics - Anfänger-Themen 3
1 main-Methode erweitern, Nachfrage nach wiedeholung Java Basics - Anfänger-Themen 2
bensdt Klasse erweitern um eine Methode "void decrement()" Java Basics - Anfänger-Themen 5
M Ein Programm erweitern, wie? Java Basics - Anfänger-Themen 3
M Array immer wieder um ein Element erweitern Java Basics - Anfänger-Themen 6
S Array Java erweitern Java Basics - Anfänger-Themen 27
I Vererbung Polygon erweitern ? Java Basics - Anfänger-Themen 4
zhermann String erweitern Java Basics - Anfänger-Themen 4
L Java Kenntnisse erweitern... Java Basics - Anfänger-Themen 10
javaerd Wie kann ich Brute Force Methode mit Strings erweitern Java Basics - Anfänger-Themen 1
M Classpath Befehl zum Kompilieren um die Option classpath erweitern. Java Basics - Anfänger-Themen 5
H Implementierung eines Interfaces erweitern Java Basics - Anfänger-Themen 13
D Datentypen 2 d array erweitern und ins negative gehen. Java Basics - Anfänger-Themen 9
J Listenimplementierung - Wie erweitern? Java Basics - Anfänger-Themen 1
F Erste Schritte If Bedingung in Schleife dynamisch erweitern Java Basics - Anfänger-Themen 4
V Dreidimensionales int Array erweitern/verkleinern Java Basics - Anfänger-Themen 4
A Properties erweitern Java Basics - Anfänger-Themen 2
H Klasse erweitern Java Basics - Anfänger-Themen 20
M Array erweitern ohne Stringbuilder Java Basics - Anfänger-Themen 6
U JFrame durch ActionListener erweitern Java Basics - Anfänger-Themen 4
HoloYoitsu args-Parameter durchschleifen (Schnittstelle erweitern?) Java Basics - Anfänger-Themen 27
R Polygon erweitern Java Basics - Anfänger-Themen 10
T Vererbung, Konstruktor erweitern Java Basics - Anfänger-Themen 4
E Input/Output Datei immer weiter erweitern Java Basics - Anfänger-Themen 4
L Array um ein Feld erweitern Java Basics - Anfänger-Themen 13
S table erweitern Java Basics - Anfänger-Themen 3
M Array in Methode erweitern und zurückgeben Java Basics - Anfänger-Themen 7
C ImageIcon erweitern Java Basics - Anfänger-Themen 6
L Array erweitern per Methode Java Basics - Anfänger-Themen 5
C OOP Externe Klasse erweitern (ohne Vererbung!!) Java Basics - Anfänger-Themen 8
E Objekt entweder erstellen oder erweitern Java Basics - Anfänger-Themen 4
C xml datei erweitern Java Basics - Anfänger-Themen 3
S Teiler ermittlen - Array erweitern? Java Basics - Anfänger-Themen 14
T array erweitern/flexible ohne collections usw. Java Basics - Anfänger-Themen 3
J Arrays erweitern - Performance vs Speicherverbrauch Java Basics - Anfänger-Themen 6
B Textdateien erweitern Java Basics - Anfänger-Themen 7
V Warum? Klasse erweitern und ausgeben Java Basics - Anfänger-Themen 3
S Welche Klasse erweitern? Java Basics - Anfänger-Themen 4
G Bildbetrachter erweitern Java Basics - Anfänger-Themen 14
G JComboBox um eine Methode erweitern Java Basics - Anfänger-Themen 2
L String erweitern. Java Basics - Anfänger-Themen 2
H 2DArray manuell dynamisch erweitern Java Basics - Anfänger-Themen 7
K Objekte/Klassen erweitern ~ Javascript Prototyp Java Basics - Anfänger-Themen 5
D Heap erweitern Java Basics - Anfänger-Themen 3
P Fenstergröße per Buttonklick erweitern? Java Basics - Anfänger-Themen 4
A Queue erweitern Java Basics - Anfänger-Themen 13
A classpath zur Laufzeit erweitern Java Basics - Anfänger-Themen 4
T Objekt erweitern Java Basics - Anfänger-Themen 3
G Feld bzw. Arrays erweitern oder zusammenfügen Java Basics - Anfänger-Themen 4
C fenster erweitern durch button Java Basics - Anfänger-Themen 3
M JList Datenstring erweitern und JList aktualisieren Java Basics - Anfänger-Themen 5
G JToolbar dynamisch erweitern Java Basics - Anfänger-Themen 8
G Menüeinträge dynamisch erweitern Java Basics - Anfänger-Themen 2
J Erweitern eines Tree-Pfades? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben