Dieser Code sagt mir nichts...

RezaScript

Bekanntes Mitglied
Hallo,

obwohl ich schon viel darüber gelesen habe, verstehe ich diese Zeile immer noch nicht:

Java:
static Set<Session> users = Collections.synchronizedSet(new HashSet<Session>());

Ich weiss, dass es eine Variable ist und dieser "Sammlung" können Daten mit users.add("Hallo") hinzugefügt werden. Mehr weiss ich aber auch nicht.

Wäre sehr dankbar, wenn mir jemand den Code Stück für Stück erklären würde.
 

mihe7

Top Contributor
Ein Set ist eine ungeordnete Menge von Objekten, in der jedes Objekt nur einmal vorkommen kann (analog einer mathematischen Menge). HashSet ist eine konkrete Set-Implementierung. Collections.synchronizedSet liefert für ein gegebenes Set ein Set, dessen Zugriffe synchronisiert sind, so dass aus mehreren Threads parallel darauf zugegriffen werden kann.
 

RezaScript

Bekanntes Mitglied
Okay danke aber das sind mir etwas zu viel Informationen und jetzt bin ich noch verwirrter als vorhin :)

Ich muss vielleicht etwas zurückspulen. Fangen wir mal mit static an.

static
Soweit ich weiss, wird es aus Memory-Gründen verwendet. Wenn also 1 Objekt den Wert der Static-Variable verändert, ändert sich der Wert auch bei alle anderen Objekten. Wenn static bei einer Methode eingesetzt wird, muss die Klasse der Methode nicht vorerst instanziiert werden, sondern kann direkt via z.B. Klasse.methode() aufgerufen werden. Korrigiere mich bitte wenn ich falsch liege.

Set<Session>
Ich gehe davon aus, dass es sich dabei um den Datentyp der Rückgabewert der Klasse Set handelt. Also genau wie wenn ich String text = "Hallo"; eingeben würde. Was danach aber mit <Session> gemeint ist, weiss ich nicht.

users
Das ist klar. So heisst die Variable.

Collections
Das ist eine Klasse, die mir statische Methoden wie synchronizedSet() zur Verfügung stellt.

synchronizedSet()
Den Set gebe ich als Parameter mit. Die Methode synchronisiert mir den Set, wieso auch immer und was auch immer mit "synchronisieren" gemeint ist. Da verstehe ich nur Bahnhof.

new HashSet<Session>()
Als Parameter wird hier ein HashSet definiert, welche nur Sessions beinhalten sollte (aber rein theoretisch könnte ich hier auch ArrayList() verwenden).

Via HashSet<String> users = new HashSet<String>(); (wieso auch immer ich hier zweimal <String> eingeben muss) könnte ich name.add("Peter"); verwenden, um Daten in der "Kette" einzufügen. Ich gehe davon aus, dass add() eine Methode der Klasse HashSet ist. Bei static Set<Session> users = Collections.synchronizedSet(new HashSet<Session>()); könnte ich jedoch auch users.add("Peter") verwenden. Warum kann ich hierbei die Methode add() verwenden? Die Klasse Collections hat ja keine add()-Methode. Zumindest konnte ich sie hier nicht finden: https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html

Was genau ist überhaupt der Unterschied zwischen
Java:
static Set<Session> users = Collections.synchronizedSet(new HashSet<Session>());
und
Java:
List test = new ArrayList();
abgesehen davon, dass bei ArrayList() mehrere Objekte vorkommen können?
 

mihe7

Top Contributor
static: kann man so stehen lassen.

Was danach aber mit <Session> gemeint ist, weiss ich nicht.
Das Session ist ein Typparameter (s. a. Generics), der der Typsicherheit dient. Wird kein Typparameter verwendet, wird automatisch Object angenommen.

Bei einem Set ohne Typparameter hättest Du eine Menge von beliebigen Objekten, Du könntest z. B. Zahlen und Strings hineinstecken, beim Rausholen müsstest Du aber immer prüfen, von welchem Typ das jeweilige Objekt ist, da die Menge den genauen Typ der Objekte ja nicht kennt. Selbst, wenn Du nur Strings reinsteckst, gibt Dir ein solches Set nur ein Object zurück, so dass Du dem Compiler mit einem "type cast" explizit der Typ mitteilen müsstest.

Zum Beispiel (ohne Typparameter):
Java:
public void summe(Set menge) {
    int sum = 0;
    for (Object obj : menge) { // die menge kennt keinen Typ, also wird vom allgemeinsten ausgegangen: Object
        if (obj instanceof Integer) { // prüfen, ob das Objekt vom Typ Integer ist, man weiß ja nie...
            sum += (Integer)obj;     // cast von Object auf Integer
        }
    }
    System.out.println("Summe: " + sum);
}

Jetzt mit Typparameter:
Java:
public void summe(Set<Integer> menge) { // Menge von Integer-Objekten
    int sum = 0;
    for (Integer wert : menge) {  // jetzt ist klar, dass die Elemente vom Typ Integer sind
        sum += wert;
    }
    System.out.println("Summe: " + sum);
}

Collections: genau, eine Utility-Klasse

Die Methode synchronisiert mir den Set, wieso auch immer und was auch immer mit "synchronisieren" gemeint ist. Da verstehe ich nur Bahnhof.
Es geht darum, dass ein und dieselbe Ressource (hier: das Set) von ggf. mehreren Threads parallel verwendet wird. Wenn zwei Kunden im Supermarkt ihr Obst wiegen, verwenden sie ein und dieselbe Ressource (die Waage). Es wäre nun äußerst ungünstig, wenn beide gleichzeitig ihre Bananen auf die Waage legen und auf den Bananenknopf drücken. Das Gewicht stimmt nicht, dann kommt ggf. nur ein Zettel raus usw. Daher muss der Zugriff auf die Waage synchronisiert werden: der eine wartet, bis der andere fertig und die Waage wieder frei ist.

Genau das gleiche muss hier auch berücksichtigen: Du hast mehrere Websockets, die alle das selbe Set verwenden wollen. Das funktioniert nur stabil, wenn der Zugriff auf das Set synchronisiert wird.

Als Parameter wird hier ein HashSet definiert, welche nur Sessions beinhalten sollte (aber rein theoretisch könnte ich hier auch ArrayList() verwenden).
Na, dann kennst Du Dich ja mit dem Typparametern aus :) Eine ArrayList könntest Du theoretisch auch verwenden, dann müsstest Du aber Collections.synchronizedList für die synchronisierte Variante aufrufen (es gibt übrigens auch Collection-Klassen, die von Haus aus auf den parallelen Zugriff ausgelegt sind, aber ich will Dich jetzt nicht weiter verwirren).

wieso auch immer ich hier zweimal <String> eingeben muss
musst Du nicht: HashSet<String> users = new HashSet<>(); reicht.

Ich gehe davon aus, dass add() eine Methode der Klasse HashSet ist.
Genau genommen ist add eine Methode des Interface Set (s. https://docs.oracle.com/javase/8/docs/api/java/util/Set.html) und HashSet implementiert dieses Interface und damit auch die Methode.

Bei static Set<Session> users = Collections.synchronizedSet(new HashSet<Session>()); könnte ich jedoch auch users.add("Peter") verwenden.
Nein. Die Variable users ist als Set für den Typ Session deklariert. Daher kannst Du nur Session-Objekte hinzufügen.

Die Klasse Collections hat ja keine add()-Methode. Zumindest konnte ich sie hier nicht finden:
Collections.synchronizedSet ist eine Methode, die ein Objekt mit Set-Interface (für den angegebenen Typ) zurückgibt. Dieses Set wird anschließend der Variablen users zugewiesen. users.add bezieht sich also nicht auf Collections sondern auf das von der Methode Collections.synchronizedSet zurückgegebene Set.

Was genau ist überhaupt der Unterschied zwischen
Ich weiß jetzt leider nicht, worauf Du hinaus willst.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
M Frage, wie dieser Code funktioniert, bzw. weshab er bei mir nicht funktioniert Java Basics - Anfänger-Themen 4
L Hilfe! Was macht dieser Code? Java Basics - Anfänger-Themen 1
S Erste Schritte Was bedeutet dieser Code? Java Basics - Anfänger-Themen 2
D Erste Schritte Was bedeutet dieser Code? Java Basics - Anfänger-Themen 23
G Lastet dieser Code den Arbeitsspeicher eines Handys aus? Java Basics - Anfänger-Themen 7
Nicole1989 Was Bewirkt dieser Java Code? Java Basics - Anfänger-Themen 4
C Warum funktioniert dieser Code nicht? Java Basics - Anfänger-Themen 2
H Geht dieser Code noch einfacher (try catch finally) Java Basics - Anfänger-Themen 7
P Geht dieser Code noch einfacher? Java Basics - Anfänger-Themen 16
P Unterschied dieser 2 code Zeilen Java Basics - Anfänger-Themen 12
M Wieso funktioniert dieser simple Code nicht? Java Basics - Anfänger-Themen 9
P Was macht dieser Source code? Java Basics - Anfänger-Themen 5
0 Was bedeutet dieser Generic-code? Java Basics - Anfänger-Themen 3
G Was macht dieser Code? Java Basics - Anfänger-Themen 3
R Was bewirkt dieser Code? Java Basics - Anfänger-Themen 6
K Warum zeigt dieser reguläre Ausdruck true an? Java Basics - Anfänger-Themen 1
N Was bedeutet dieser Fehler Java Basics - Anfänger-Themen 2
Leo0909 Ich brauche Hilfe bei dieser Aufgabe Java Basics - Anfänger-Themen 2
P Was bedeutet dieser Fehler? Java Basics - Anfänger-Themen 31
P Nutzer entscheiden lassen, wie viele Zahlen dieser in ein Array eingeben möchte. Java Basics - Anfänger-Themen 6
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
Bluedaishi Hilfe beim erklären dieser Methode Java Basics - Anfänger-Themen 5
S Warum dieser Fehler? Java Basics - Anfänger-Themen 1
B Datum in dieser Range SQL? Java Basics - Anfänger-Themen 3
D Erste Schritte Lösen dieser Aufgabe, Hilfe! Java Basics - Anfänger-Themen 12
J Brauche Hilfe bei dieser Aufgabe Java Basics - Anfänger-Themen 3
F Wieso wird dieser Befehl nicht ausgeführt? (Anfänger) Java Basics - Anfänger-Themen 2
V Operatoren Warum kommt nicht das gewünschte Ergebnis dieser Operation? Java Basics - Anfänger-Themen 3
R Gibt es Eine einfache Programierung dieser Methoden Java Basics - Anfänger-Themen 8
B Was passiert in dieser Methode? Java Basics - Anfänger-Themen 3
B Summe aller Zahlen von 1 bis zu dieser Zahl (ohne while oder for schleife) Java Basics - Anfänger-Themen 4
J Wo liegt nur an dieser einfachen Bedingung mein Fehler? Java Basics - Anfänger-Themen 8
A Wieso funktioniert dieser Timer nicht?? Java Basics - Anfänger-Themen 3
A Lässt sich dieser Ausdruck irgendwie einfacher schreiben? Java Basics - Anfänger-Themen 4
G Bitte um Erklärung dieser einer Zeile Java Basics - Anfänger-Themen 5
F OOP Warum funktioniert dieser Regex? Java Basics - Anfänger-Themen 15
S Was bedeutet dieser ausdruck? Java Basics - Anfänger-Themen 9
StrikeTom Was ist an dieser einfachen funktion falsch? Java Basics - Anfänger-Themen 5
M prozess starten und warten bis dieser sich beendet Java Basics - Anfänger-Themen 3
S OOP Wie muss meine Klasse zu dieser main aussehen? Java Basics - Anfänger-Themen 5
H Wie so ein Exception in dieser HashMap? Java Basics - Anfänger-Themen 7
K Was wird in dieser Frage gemeint ? Java Basics - Anfänger-Themen 15
V Wie und wieso geht dieser Methodenaufruf? Java Basics - Anfänger-Themen 2
G Versteh nicht was an dieser If-Anweisung falsch ist Java Basics - Anfänger-Themen 2
S Ursache dieser Fehlermeldung (access dinied) Java Basics - Anfänger-Themen 3
A Was macht dieser Prgrammteil? Java Basics - Anfänger-Themen 2
B Warum hat dieser einfache Algorithmus lineare Laufzeit? Java Basics - Anfänger-Themen 3
B Wieso funktioniert dieser Vergleich nicht? Java Basics - Anfänger-Themen 3
A Welche dieser Schleifen im TableCellRendererist effizienter? Java Basics - Anfänger-Themen 18
A Was ist an dieser Datum-Methode falsch? Java Basics - Anfänger-Themen 5
J Was sagt mir dieser Ausdruck? Java Basics - Anfänger-Themen 9
S Brauche hilfe zu dieser AUfgabe Java Basics - Anfänger-Themen 4
M Was ist an dieser case-Anweisung falsch? Java Basics - Anfänger-Themen 2
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
terashy VS Code Project run error Java Basics - Anfänger-Themen 10
JaZuDemNo Code Erklärung Java Basics - Anfänger-Themen 3
M Connect-4-Code analysieren Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
T Fehlercode bei code der das Alter ausrechnet Java Basics - Anfänger-Themen 2
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
jhfjeh Strukturgramm in code Java Basics - Anfänger-Themen 11
D Tipps zum Code Java Basics - Anfänger-Themen 24
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
Say Stelle in Code herausfinden, wie geht man vor? Java Basics - Anfänger-Themen 12
Say do-While Code Ausführung Java Basics - Anfänger-Themen 3
W Rückfrage zur Programmgestaltung (clean code) Java Basics - Anfänger-Themen 12
M intelliJ auf neuem PC, plötzlich kein Code Java Basics - Anfänger-Themen 3
Pinhg Sound in Greenfoot Code einbinden Java Basics - Anfänger-Themen 2
C Java boolean Code läuft nicht Java Basics - Anfänger-Themen 5
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
A Wie könnte man diesen Code kürzer machen ? Java Basics - Anfänger-Themen 7
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
K Wie kann man diesen Code schnell und effizient interpretieren (Man hat nur 4 Minuten) Java Basics - Anfänger-Themen 3
R ISBN-10-Code überprüfen Java Basics - Anfänger-Themen 7
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
I HTML Code säubern Java Basics - Anfänger-Themen 4
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
N Java-Code abwärtskompatibel machen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben