Macht es Sinn Arraylisten mit Gettern zu übergeben?

Status
Nicht offen für weitere Antworten.

auxilium

Mitglied
Also normalerweise soll ja alles bestenfalls private deklariert werden,


aber macht das sinn bei einer arraylist.

Wird die ganze arraylist übergeben, so kann ich immer noch werte ändern, da ja die arrayliste mit all ihren funktionen weitergegeben wird.

Gebe ich nur bestimmte funktionen der Arrayliste weiter, zb. die size(), dann läppert es sich an den funktionen.
 

Niki

Top Contributor
Es kommt immer auf den Anwendungsfall an. Bei einem TableModel für eine JTable würde ich z.B. schon eine Methode setContent(List l) anbieten. Manchmal macht es aber auch nur sinn add und remove Methoden anzubieten.
 

Marco13

Top Contributor
Dummerweise sind "einfach" und "gut" häufig nicht vereinbar. (Und wenn man sie DOCH vereinen kann, ist das "einfach gut" :D )

Man sollte IMHO auf keinen Fall sowas machen wie
Code:
class Bla
{
    private ArrayList<String> list = new ArrayList<String>();

    public ArrayList<String> getList() { return list; }
}
Das ist aus verschiedenen Gründen schlecht. Immernoch schlecht (aber etwas weniger schlecht) wäre
Code:
class Bla
{
    private List<String> list = new ArrayList<String>();

    public List<String> getList() { return list; }
}
aber würde immernoch die Kapselung verletzen.


Sowas
Code:
class Bla
{
    private List<String> list = new ArrayList<String>();

    /** ... returns an unmodifiable view on the list... */
    public List<String> getList() { return Collections.unmodifiableList(list); }
}
kann OK sein, wenn man jemandem nur Lese-Zugriff auf die Liste geben will.

Sowas
Code:
class Bla
{
    private List<String> list = new ArrayList<String>();

    /** ... returns A COPY OF the List ... */
    public List<String> getList() { return new ArrayList<String>(list); }
}
wäre OK, aber der Kommentar ist dann besonders wichtig

Am saubersten (in bezug auf die Kapselung) ist aber tatsächlich sowas
Code:
class Bla
{
    private List<String> list = new ArrayList<String>();

    public int getListSize() { return list.size(); }
    public String getListElement(int index) { return list.get(index); }
}
 
M

maki

Gast
Am saubersten (in bezug auf die Kapselung) ist aber tatsächlich sowas
Was wäre denn am deinem Beispiel davor (Kopie der Liste wird zurückgegeben -> immutable) an der Kapselung auszusetzen, schliesslich verhalten sich die meisten Standard Javatypen auch so?
 

Marco13

Top Contributor
Daran ist nichts falsch (hab ich ja auch geschrieben (bzw. eben nicht :wink: )) aber es ist wichtig, dass das eindeutig und unmißverständlich dokumenteiert (oder am Methodennamen ersichtlich) ist (sonst fürgt jemand etwas zu dieser Liste hinzu, und wundert sich, wieso im Objekt nichts ankommt). Ob dieses Konstrukt noch Sinn macht, wenn man den "Listeninhalt verändern können" will, ist aber fraglich... Wenn man schon eine "addToList" Methode anbietet, würden "getFromList" und "getListSize" imho "konzeptionell" eher passen als ein "getCopyOfList"....
 

Janus

Bekanntes Mitglied
für rein lesenden zugriff lass ich solche klassen gern Iterable und Iterator implementieren, sofern kein random access nötig ist.
 

Marco13

Top Contributor
Das ist zwar praktisch, aber beim Implementieren von Iterabel stellt sich immer die brennende Frage: WORÜBER Iteriert man? :( Bei Objekten, die z.B. zwei Listen kapseln, funktioniert das schon nichtmehr - da kann man bestenfalls zwei verschiedene "getIterator"-Methoden anbieten :?
 

Wildcard

Top Contributor
Alles ist möglich, referenzen einer Liste, kopien einer Liste, besagte Unmodifiable Listen, Iteratoren, getter für einzelne Elemente, Arrays,...
Der Punkt ist, es muss zum Anwendungsfall passen und exakt in der Java Doc beschrieben sein
 

Marco13

Top Contributor
Die Wichtigkeit der Dokumentation hatte ich (speziell bei den Formen, bei denen man nicht an der Signatur erkennt, was man bekommt) schon betont.

Aber eine Liste tatsächlich als echte Referenz zu übergeben, ist wohl nur SEHR, SEHR selten angebracht :? jeder "Idiot", der sich diese Liste holt, kann sie einfach löschen, oder (was meistens noch schlimmer wäre: ) sowas machen wie list.set(index, null); - und in der JavaDoc ALLES zu beschreiben, was man über die Liste annimmt ("...it is assumed that the caller will not set elements in this list to 'null'" usw.) wäre etwas, was man wohl kaum so konsequent durchhalten könnte...

Aber grundsätlich finde ich auch, dass man sich bei sowas am angedeuteten "Design by contract" orientieren sollte :toll:
 

Wildcard

Top Contributor
Marco13 hat gesagt.:
Aber eine Liste tatsächlich als echte Referenz zu übergeben, ist wohl nur SEHR, SEHR selten angebracht :? jeder "Idiot", der sich diese Liste holt, kann sie einfach löschen, oder (was meistens noch schlimmer wäre: ) sowas machen wie list.set(index, null); - und in der JavaDoc ALLES zu beschreiben, was man über die Liste annimmt ("...it is assumed that the caller will not set elements in this list to 'null'" usw.) wäre etwas, was man wohl kaum so konsequent durchhalten könnte...
Hast du mal versucht eine Liste umzusortieren wenn du nur Kopien bekommst und lediglich eine setElementAt Methode oder sowas hast?
Wenn du dir zB EMF anschaust, dann ist es ganz normal dort einen getter für die original Referenz auf die Liste zu haben.
Das ist auch durchaus praktisch, weil man mit wenig Code viel erreichen kann. Zugegebener maßen sind die dort verwendeten ELists auch etwas cleverer als die java.util Listen. Sie haben zB Notification Support und erzwingen Constraints, wodurch die von dir beschriebenen Szenarien so nicht möglich sind, wenn nicht explizit erlaubt.
Davon abgesehen ist es auch (gerade bei Kopien) eine Performancefrage, Wenn es sich um eine sehr kritische Stelle handelt, kann das durchaus einen Unterschied machen.
 

semi

Top Contributor
...und in JPA sollte man die Collections innerhalb von Entity-Beans nicht durch irgendwas anderes ersetzen
oder Kopien zurückgeben, da sie von der JPA Implementierung gemanaged werden (Stichwort: Proxy etc.)
 

Marco13

Top Contributor
Naja, wenn man nur eine getElementAt und getSize hat kann man sowieso nichts an der Liste machen. Wenn man aber zusätzlich ein removeElement und insbesondere AUCH eine setElementAt bereitstellt, hat man sowieso schon so viel Zugriff gewährt, dass es OK wäre, dort auch eine echte Referenz zurückzugeben - man kann ja praktisch alles, was man mit der Referenz machen kann, auch mit den einzelnen Methoden machen :roll:
(Dann wäre das einzige Argument vielleicht noch die Kapselung des Typs, aber "List" ist so allgemein, dass das dann kaum noch eine Rolle spielt)

Ohne eine setElementAt methode wäre das Beispiel mit dem Sortieren natürlich ... hmgl :?
Code:
ArrayList elements = ...
while (x.getNumElements() > 0)
{
    Element element = x.getElement(0);
    elements.add(element);
    x.removeElement(element);
}
Collections.sort(elements);
for (Element element : elements) x.addElement(element);
... ja, sowas muß ja nicht sein :)
 

ms

Top Contributor
semi hat gesagt.:
...und in JPA sollte man die Collections innerhalb von Entity-Beans nicht durch irgendwas anderes ersetzen
oder Kopien zurückgeben, da sie von der JPA Implementierung gemanaged werden (Stichwort: Proxy etc.)
Das gilt aber nur für annotierte Methoden oder Felder. Man kann ja zusätzlich noch öffentliche Methoden bereitstellen, die wiederum eine sortierte Kopie oder dergleichen zurückliefern.

ms
 

semi

Top Contributor
@ms
Klar, von mir aus auch rückwärts ausgeben ;) Letztendlich schützt man sich dabei vor Problemen, die man kennt
und produziert überflüssigen Code. Wenn ich weiss, dass ich auf eine Collection nur lesend zugreife, warum soll
ich diese immer kopieren? Ich ändere ja nichts.
Wenn man es so sieht, müsste man überall, wo Referenzen im Spiel sind, Kopien erzeugen. Nicht nur bei Collections,
Arrays etc.
z.B. wenn ein Objekt einen Datensatz, sagen wir mal Adresse, zurückgibt, habe ich über die Setter Zugriff auf die
Interna der Adresse und kann sie manipulieren. Man müsste davon wieder eine Kopie anfertigen, um das Original
"zu schützen" oder zwei Versionen anbieten, Mutable und Immutable. Frage ist nur wen schützt man vor wem? ;)
 

Wildcard

Top Contributor
ms hat gesagt.:
Genau darum kann man pauschal nicht sagen was besser ist und was nicht, weil es letztendlich von der Anwendung abhängt.
Ganz genau. Und die gewählte Methode wird in Java Docs festgehalten die dann den 'Vertrag' für die Methode darstellt.
 

semi

Top Contributor
OK, dann zitiere ich mich selbst und formuliere das hier
semi hat gesagt.:
Wenn ich weiss, dass ich auf eine Collection nur lesend zugreife, warum soll
ich diese immer kopieren? Ich ändere ja nichts.
in das hier um.

Wenn ich weiss, dass ich eine Collection ändern will, die ich laut API nicht ändern darf/soll, mache ich eine Kopie
davon und arbeite mit dieser weiter.
Code:
List<Address> list = new ArrayList<Address>(person.getAddressList());
Collections.sort(list, new AddressComparator());
Ich nehme an, da sind wir uns einig. :wink:
 

ms

Top Contributor
semi hat gesagt.:
OK, dann zitiere ich mich selbst und formuliere das hier
semi hat gesagt.:
Wenn ich weiss, dass ich auf eine Collection nur lesend zugreife, warum soll
ich diese immer kopieren? Ich ändere ja nichts.
in das hier um.

Wenn ich weiss, dass ich eine Collection ändern will, die ich laut API nicht ändern darf/soll, mache ich eine Kopie
davon und arbeite mit dieser weiter.
Code:
List<Address> list = new ArrayList<Address>(person.getAddressList());
Collections.sort(list, new AddressComparator());
Ich nehme an, da sind wir uns einig. :wink:
Java bietet genügend Mechanismen um solche Vereinbarungen technisch zu realisieren. Warum sollte ich also
darauf verzichten und in der Api-Doc in prosa reinschreiben, dass jeder, der die Collection verwendet sie auf keinen Fall verändern darf?
Dein Ansatz kann funktionieren (zB. in Ein-Mann-Projekten) aber er muss nicht. Ich würde mich auch nicht darauf verlassen, dass jeder der die Funktion verwendet auch die Api-Doc liest. Dann produziert womöglich dein Programm einen Fehler obwohl der Entwickler Schuld daran ist. Da ist es doch wesentlich sicherer alle technischen Hilfsmittel zu verwenden und nur das Verhalten zu beschreiben anstatt eine Vorschrift zu deklarieren.

ms
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Interfaces von Interfaces macht das noch Sinn? Java Basics - Anfänger-Themen 21
R getUserProperties() macht für mich keinen Sinn Java Basics - Anfänger-Themen 8
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
berserkerdq2 Warum macht man in IJVM am Anfang Bipush 0? Java Basics - Anfänger-Themen 1
S Was macht ++ ohne Schleife? Java Basics - Anfänger-Themen 4
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
K Gleitkommazahl macht man 0 punkt matisse oder 1 punkt matisse Java Basics - Anfänger-Themen 2
B Methoden warum macht die Methode nicht das was ich erwarte? Java Basics - Anfänger-Themen 2
E Macht Java Rechenfehler beim Potenzieren und Mod? Java Basics - Anfänger-Themen 5
V Switch Methode macht Code kaputt Java Basics - Anfänger-Themen 18
N Was macht die Klasse? Java Basics - Anfänger-Themen 3
T Was macht diese Zeile? Java Basics - Anfänger-Themen 9
L Was genau macht -> Java Basics - Anfänger-Themen 18
J Was genau macht die Methode close() im InputStream? Java Basics - Anfänger-Themen 5
U Best Practice Fehleranalyse, welche Fehler macht Ihr beim Lernen bzw. auch später Java Basics - Anfänger-Themen 12
L Hilfe! Was macht dieser Code? Java Basics - Anfänger-Themen 1
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
M Was macht super (...)? Java Basics - Anfänger-Themen 1
Tommy135 Klassen jComboBox macht nicht was sie soll Java Basics - Anfänger-Themen 4
J JButton macht was er will Java Basics - Anfänger-Themen 3
R While-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 24
JavaNewbie2.0 Habe ein frage wie man etwas macht. Java Basics - Anfänger-Themen 13
B Was macht diese Methode? Java Basics - Anfänger-Themen 9
P Was macht diese methode Java Basics - Anfänger-Themen 2
Tacofan Was macht dieses "Stückchen Code"? Java Basics - Anfänger-Themen 3
F JSON null macht mir ein Problem Java Basics - Anfänger-Themen 3
L Was genau macht "public static void" ? Java Basics - Anfänger-Themen 12
C Hilfe - Kleines Programm macht mir Schwierigkeiten Java Basics - Anfänger-Themen 2
G Methoden Was genau macht die Methode light.setInfluencingBounds ? Java Basics - Anfänger-Themen 5
B Erste Schritte Way of life ohne import - Habe Beispiel, macht Unfug Java Basics - Anfänger-Themen 21
D Methoden Filewriter macht keine Zeilenumbrüche Java Basics - Anfänger-Themen 3
E Erste Schritte [Noob-Frage] Meine If-Abfrage macht nicht, was sie soll... Java Basics - Anfänger-Themen 2
H Tastatur.wurdeGedrueckt() macht nicht das, was ich will :/ Java Basics - Anfänger-Themen 2
K Was macht hier genau return? Java Basics - Anfänger-Themen 2
E Einfache For-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 2
J Shakersort, das Array macht Probleme! Java Basics - Anfänger-Themen 4
A scan.nextLine() - Wenn man zu lange nichts macht, soll etwas passieren Java Basics - Anfänger-Themen 3
C Scrollpanel autoscroll(false) macht nix Java Basics - Anfänger-Themen 2
M StringTokenizer macht Quatsch Java Basics - Anfänger-Themen 21
N Papaklasse macht Zicken mit Parameterkonstruktor Java Basics - Anfänger-Themen 7
K Datentypen double x als Bruch aus Integern macht x zu integer? Java Basics - Anfänger-Themen 3
C Erste Schritte was macht eigentlich "for (;;)" Java Basics - Anfänger-Themen 7
C JDK-Installer macht nichts Java Basics - Anfänger-Themen 11
A JApplet: einbinden von weiteren Jars macht Probleme Java Basics - Anfänger-Themen 2
B Variablen Wie macht man eine call by reference mit primitiven Datentypen in Java? Java Basics - Anfänger-Themen 2
I Für was macht man "deep Kopien" Java Basics - Anfänger-Themen 4
S Erste Schritte While do Schleife - macht nicht was sie soll Java Basics - Anfänger-Themen 7
9 Programm macht nicht was es soll Java Basics - Anfänger-Themen 6
H Was macht diese Methode? Java Basics - Anfänger-Themen 3
S JApplet macht Probleme Java Basics - Anfänger-Themen 2
Y Was macht folgende Regular Expression Java Basics - Anfänger-Themen 2
M Was macht bzw. was bringt ein constructor? Java Basics - Anfänger-Themen 12
P orphaned case macht probs Java Basics - Anfänger-Themen 3
ruutaiokwu System.err.print(ln) macht ein durcheinander??! Java Basics - Anfänger-Themen 8
X Selectionsort macht Probleme Java Basics - Anfänger-Themen 2
P was macht der code? Java Basics - Anfänger-Themen 4
M OOP for Schleife macht mir Probleme mit Arrays Java Basics - Anfänger-Themen 7
R Was macht...? Java Basics - Anfänger-Themen 4
alderwaran closed source jar, kein javadoc. was macht methode x eigentlich? ( oracle forms pjc beans ) Java Basics - Anfänger-Themen 2
M JavaEditor macht Probleme! Invalid Flag! Java Basics - Anfänger-Themen 9
P Was macht dieser Source code? Java Basics - Anfänger-Themen 5
R BufferedWriter macht komische Zeichen Java Basics - Anfänger-Themen 3
I KeyEvent macht nichts.^^ Java Basics - Anfänger-Themen 3
E new File macht den Pfad kaputt Java Basics - Anfänger-Themen 15
S Wie macht man sowas?? Ist da ne If-Schleife richtig?? Java Basics - Anfänger-Themen 22
Pithecanthropus Thread anhalten, der aber ein readObject() macht. Java Basics - Anfänger-Themen 4
T aufruf methode in methode macht probleme Java Basics - Anfänger-Themen 9
I Was macht diese Funktion? Java Basics - Anfänger-Themen 4
0 Was macht eine IOException? Java Basics - Anfänger-Themen 4
0 Was ist ein GregorianCalender?(Was macht es etc.) Java Basics - Anfänger-Themen 2
T Calender / DateFormat macht plus ein Monat Java Basics - Anfänger-Themen 3
T "x hoch y" macht nur "x mal x"^^ Java Basics - Anfänger-Themen 3
M Objektorientierung - wie macht man's richtig? Java Basics - Anfänger-Themen 3
M JPanel und JTabbedPane macht probleme Java Basics - Anfänger-Themen 5
S Formatierter String macht Probleme Java Basics - Anfänger-Themen 9
G JComboBox macht Probleme Java Basics - Anfänger-Themen 7
G Warum das Prog mehrmals das gleiche macht wegen ItemListener Java Basics - Anfänger-Themen 4
S Eclipse macht 2 Fenster auf Java Basics - Anfänger-Themen 4
S was macht super() ? Java Basics - Anfänger-Themen 7
B replaceAll macht nix! :-( Java Basics - Anfänger-Themen 4
V .jar macht keine Datenbank abfragen Java Basics - Anfänger-Themen 3
S Was macht [Integer.toString(number, tarRadix)] Java Basics - Anfänger-Themen 3
T Möchte Charwert 23C° mit java.util.Scanner einlesen macht Pr Java Basics - Anfänger-Themen 2
S wie macht man aus einem int ein double? Java Basics - Anfänger-Themen 2
F Eingabe darf nur 1 oder 0 sein. Meine Lösung macht Probleme. Java Basics - Anfänger-Themen 8
D [DONE] JDK Installation: Compiler macht Probleme. Java Basics - Anfänger-Themen 3
A Was macht dieser Prgrammteil? Java Basics - Anfänger-Themen 2
H Key Listener macht nicht das was er soll Java Basics - Anfänger-Themen 4
G RadioButton in JTable macht Probleme Java Basics - Anfänger-Themen 5
M was macht Syncronized ? Java Basics - Anfänger-Themen 2
G Was bzw. wie macht man das, wenn man jar. datei hat Java Basics - Anfänger-Themen 6
G warum macht er das Java Basics - Anfänger-Themen 4
R BorderLayout macht meine Zeichnung kaputt Java Basics - Anfänger-Themen 14
G Was macht dieses Program ? Java Basics - Anfänger-Themen 13
G Was macht dieser Code? Java Basics - Anfänger-Themen 3
M renderer macht nur 1 spalte bunt Java Basics - Anfänger-Themen 5
U was macht "private" ? :) Java Basics - Anfänger-Themen 7
frau-u guter Stil - wie macht mans am Besten? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben