kostenloser Webspace werbefrei: lima-city


Enumeration vs Collection

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    c****s

    Folgender Sachverhalt: Ich habe 2 EJBs namens Person und Group. Group hat eine Feld namens members, das in einer @OneToMany-Beziehung zu der Klasse Person steht, also:

    @OneToMany (fetch = FetchType.EAGER)
    public Collection <Person> getMembers () { return members; }
    public void setMembers (Collection <Person> members) { this.members = members; }


    Soweit, alles schön und gut. In meiner GUI habe ich nun irgendwo eine JList, die die Mitglieder einer Gruppe anzeigt und aus der auch der Nutzer löschen oder hinzufügen kann. Die Einträge einer JList krieg ich von der API nun als Enumeration zurück, muss sie aber dem EJB als Collection übergeben. Zur Zeit behelfe ich mich wie folgt:

    Enumeration <Person> enu = (Enumeration <Person>) ( (DefaultListModel) lstMembers.getModel () ).elements();
    Collection <Person> pers = new ArrayList <Person> ();
    while (enu.hasMoreElements () )
    	pers.add (enu.nextElement () );
    group.setMembers (pers);


    Das ist ja mal über den Holzweg durch die Brust ins Auge. Es muss doch einen einfacheren Weg geben um von einer Enumeration zu einer Collection zu kommen. Ein einfacher Typecast bezweckt eine häßliche Exception sonst nichts. Googeln hat nur Kot heraufgebracht.

    Wie wandle ich eine Enumeration in eine Collection um?

    (kernel 2.6.28-11, sun java jre 6u13, sun java 6 ee, glassfish v2)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. e********l

    Tja...da hast du nicht viele Möglichkeiten. Entweder akzeptierst du, dass man nur auf diesem Wege von Enumeration zu einer Collection gelangt oder du schreibst ein eigenes ListModell das dir eine Collection der Daten zurück gibt.
  4. dirkinsingapur

    dirkinsingapur hat kostenlosen Webspace.

    Sicherlich kannst du ein eigenes ListModel erstellen, das Interface ListModel schreibt auch nur 4 Methoden vor, die du implementieren musst. Dort kannst du dann die Listeneinträge in einer Collection speichern und die über einen getter abfragen.

    Allerdings ist die Lösung unschön, da du deiner GUI zu viel Verantwortlichkeit gibst. Natürlich funktioniert es, aber es ist wiederspricht eben den gängigen Design Principles. Besser wäre es, wenn du deine GUI komplett von der Logik entkoppelst. Im Klartext: GUI nur für die Darstellung, d.h. sie ist einfach gegen eine andere GUI austauschbar. Die Logik, nämlich welche Personen gerade Teil einer Gruppe sind,gehört dann in eine Modelschicht.

    Vielleicht suchst du mal nach MVC (Model View Controller). Speziell für Java gibt es da unendlich viele Möglichkeiten, wie man das nun genau implementiert, alles hat Vor- und Nachteile und ist Abhängig von deinen Anforderungen.
  5. Hi,

    also Enumeration nach Collection scheint mir ziemlich aussichtslos.
    Würde dir evtl. auch der Weg von JList nach Collection was ntüzen?
    Falls das so ist, dann versuche doch mal:
    Collection<Person> pers = new ArrayList<Person>(Arrays.asList((Arrays.asList(((DefaultListModel)lstMembers.getModel()).toArray())).toArray(new Person[((DefaultListModel)lstMembers.getModel()).getSize()])));

    Bei mir lässt es sich compilieren und ausführen.
    Ob es natürlich im Ergebnis einfacher oder besser ist, als deine Funktion lasse ich mal dahingestellt.

    Gruß
    Manni
  6. fakt ist: das casten ist definitiv nicht möglich, beweis:

    Interface Enumeration<E> hat kein Superinterface, siehe http://java.sun.com/javase/6/docs/api/java/util/Enumeration.html

    Interface Collection<E> hat Superinterface Iterable<E>, siehe http://java.sun.com/javase/6/docs/api/

    Interface Iterable<T> hat kein Superinterace, siehe http://java.sun.com/javase/6/docs/api/java/lang/Iterable.html

    Um casten zu können müsste Enumeration eine Unterklasse von Iterable sein, siehe http://www.java2s.com/Tutorial/Java/0100__Class-Definition/TypeCasting.htm

    mich würde Interessieren, welche statische/dynamische Klassen "lstMembers" hat, weil die ja auch erst mal "zurechtgecastet" werden.

    Also im Schlimmsten fall, haste eine konstante Laufzeit von n, bei n Elementen - oder "lstMembers" ermöglicht doch noch einen direkten cast.


  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!