Objekte anlegen und Singleton Pattern

Status
Nicht offen für weitere Antworten.

DennisXX

Bekanntes Mitglied
Hi Leute, ich habe eine Frage zu dem folgenden Java Programm:

Java:
public static void main (String[] args) {
       
        for (int i = 0; i < 10; i++) {
            System.out.println("Objekt Nummer" + i + "wird jetzt erzeugt");
            String name = new String();    //Hierzu meine Frage
        }
   
}

In der Zeile in der ich einen Kommentar eingefügt habe, wird ja explizit ein String Objekt erzeugt. Dieses geschieht insgesamt 10mal (ist ja definiert in der for-schleife).

Meine Frage: Werden jetzt eigentlich insgesamt 10 Objekte im Speicher abgelegt oder nur eins? Wenn es 10 sind, kann ich die dann alle über name ansprechen? Verweist die Referenzvariable name bei jedem Schleifendurchlauf auf ein neues Objekt und die alten werden gelöscht?

Hier meine Frage zu dem Singletonmuster:

Java:
public class Singleton{

	private static Singleton instance;

	private Singleton(){

		System.out.println("Im Konstruktor");	
	
	}

	public static Singleton getSingleton(){

		if(instance == null){

		       instance = new Singleton();

		}
		
		else
		
			System.out.println("Fehler !");
		
		return instance;

	}
	
}

Warum ist hier die Instanzvariable instance mit static deklariert? Warum kann ich stattdessen nich einfach "private Singleton instance;" schreiben?

Danke euch für die Mithilfe!
 
Zuletzt bearbeitet:

sparrow

Top Contributor
Stichworte zum selber rausfinden:

Sichtbarkeit von Variablen
Gültigkeitsbereich von Variablen
Garbage Collector


Du erzeugst zwar 10 Objekte, die werden aber alle vom Garbage Collector brav freigegeben.
Antwort auf deine Frage, nach der for-Schleife hast du genau 0 String-Objekte.
 

andre111

Bekanntes Mitglied
Bei jedem Schleifendurchlauf wird ein neues String-Objekt erzeugt auf das dann mit name referenziert wird. Die alten Objekte liegen weiterhin im Speicher und können irgendwann vom Garbage-Collector gelöscht werden.
 

andre111

Bekanntes Mitglied
Du kannst mit name immer nur das im aktuellen Schleifendurchlauf erstellte String-Objekt ansprechen, da name nur auf dieses referenziert und auf kein anderes.
 

DennisXX

Bekanntes Mitglied
Es sei denn sie ist in dem Block darüber definiert.

D.h. also wenn ich den Code etwas abändere, dann kann ich alle 10 Objekte über name ansprechen?

Java:
public static void main (String[] args) {
       
        String name;

        for (int i = 0; i < 10; i++) {
            System.out.println("Objekt Nummer" + i + "wird jetzt erzeugt");
            name = new String();    //Hierzu meine Frage
        }
   
}

Danke für eure Hilfe !
 

sparrow

Top Contributor
Nein, du überschreibst 10x den String.

Für das was du vorhast benötigst du ein Array oder eine Collection.
 

Landei

Top Contributor
Seit Java 1.5 kann man auch enums als Singletons mißbrauchen:
Code:
enum Singleton {
   INSTANCE;
   public void sayHello() { System.out.println("Hi there"); }
}
 

sparrow

Top Contributor
Oh, habe deine 2. dazueditierte Frage jetzt erst gesehen.

Static gehört zu den Grundlagen, und die lernt man am Besten aus der Literatur.
Ich habe Java mit dem "Handbuch der Java-Progammierung" gelernt, die HTML-Version kann man sich unter www.javabuch.de - Das Handbuch der Java-Programmierung kostenlos runterladen.

static sorgt dafür, dass das so deklarierte Objekt / Methode einmalig (je ClassLoader) ist.
Eine static-Methode in einer Klasse kann man zum Beispiel aufrufen ohne das entsprechende Objekt zu initialisieren (also eine Instanz der Klasse zu erzeugen).
Machst du nur eine Variable einer Klasse static greifen alle Klassen auf die selbe Variable zu, anstatt das jede eine eigene Variable in der eigenen Instanz besitzt.

Gruß
Sparrow
 

DennisXX

Bekanntes Mitglied
Machst du nur eine Variable einer Klasse static greifen alle Klassen auf die selbe Variable zu

Diese variable gibt es dann definitiv nur 1x und nicht häufiger!?

anstatt das jede eine eigene Variable in der eigenen Instanz besitzt.

Ok, ich erzeuge z.B. 5x Objekte irgendeiner Klasse, die eine static Variable implementiert hat. Jedes dieser 5 Objekte hat dann jeweils eine static Variable? Ich glaube nicht, sondern es gibt nur eine einzige variable, egal wieviele Objekte ich erzeuge. Ich hoffe, ich habe es nun richtig verstanden...
 

sparrow

Top Contributor
Wenn die Klassen vom selben Typ sind greifen sie alle auf eine static Variable zu.

Probiers aus, macht Spass.

Deklarier eine Klasse die eine static-Variable hat und lass sie im Konstructor hochzählen.
Damit erschließt sich dann auch gleich ein möglicher Sinn der static-Variablen.

Übrigens: übermässiger Gebraucht davon ist Gift für objektorientiertes Programmieren. Es gilt also abzuwägen ob eine static-Variable nötig uns sinnvoll ist.

Gruß
Sparrow
 

DennisXX

Bekanntes Mitglied
Ich habe es eben mal ohne static durchlaufen lassen und habe vom Compiler diese Fehlermeldung erhalten:

non-static variable instance cannot be referenced from a static context

if(instance == null){

^
Diese Fehlermeldung erhalte ich auch, wenn ich bei der publicmethode das static entferne. Vielleicht denke ich jetzt einfach zu kompliziert, aber irgendwie verstehe ich das nicht ganz...
 

sparrow

Top Contributor
Wenn das kommt liegt folgendes vor:

du hast eine Methode static deklariert. Nimm dir einen Moment Zeit und denk darüber nach was das heisst. Diese Methode kann immer und überall, ohne dass die umliegende Klasse initialisiert wurde, angesprungen werden.
Erkennst du vielleicht warum deine main-Methode deshalb static sein muss?
So, und irgendwo in dieser static-Methode greifst du auf eine Objekt/eine Variable zu die NICHT static ist und sich außerhalb der Methode befindet. Das kann nicht funktionieren. Verstehst du warum? Weil das worin die Variable eingebettet ist, nämlich die Klasse, unter Umständen nicht initialisiert ist, der Variable fehlt der Kontext/das worin sie eingebettet ist.
Aus diesem Grund können aus einem statischem Kontext/einer statischen Methode, nur Variablen/Objekte angesprochen werden die selbst auch statisch sind. Denn dann sind sie einmalig und existieren unabhängig der Klasse in der sie stehe.


Gruß
Sparrow
 

DennisXX

Bekanntes Mitglied
Das heißt also wenn ich private static Singleton instance; sage, dann muss ich auch public static Singleton getSingleton() sagen, sonst klappt das nicht.

Also wäre bspw. private Singleton instance; und public static Singleton getSingleton() falsch...

..genauso wie...

private static Singleton instance; und public Singleton getSingleton() falsch...
 

andre111

Bekanntes Mitglied
Letzteres wäre nicht falsch, weil du aus einer nicht statischen Methode auf statische Variablen zugreifen darfst/kannst.
 

DennisXX

Bekanntes Mitglied
Eine Frage habe ich nochmal zu dem Thema. Worin besteht eigentlich genau de Vorteil, wenn ich eine Referenzvariable mit null inistailisiere, also bspw.

Java:
public class Singleton{
 
    private static Singleton instance = null;
 
    private Singleton(){
 
        System.out.println("Im Konstruktor");   
    
    }
 
    public static Singleton getSingleton(){
 
        if(instance == null){
 
               instance = new Singleton();
 
        }
        
        else
        
            System.out.println("Fehler !");
        
        return instance;
 
    }
    
}

oder in einem solchen Beispiel

Java:
public class Test{

private ref1 = null

....

}

Was bringt es mir, hier mit der null-Referenz zu arbeiten?
 

andre111

Bekanntes Mitglied
null heißt nur, dass die Referenz auf kein Objekt bzw. irgendwo hin ins Nichts zeigt.
Java:
public class Test {
    private Object ref = null;
}
ist das Gleiche wie
Java:
public class Test {
    private Object ref;
}
Ein Objekt wird anfangs immer mit null initialisiert. Bei primitiven Datentypen gilt das allerdings nicht, die werden mit 0 bzw. bei boolean mit false initialisiert.
 

andre111

Bekanntes Mitglied
Manche schreiben das = null mit dazu, weil es verdeutlich, dass die jeweilige Referenz auf nichts zeigt, man kann es aber auch ganz einfach weglassen.
 

sliwalker

Top Contributor
Hi,

es sein aber angemerkt, dass, sobald die Initialisierung der "instance" Variable nicht von der Runtime gemacht wird, das SingletonPattern nicht threadsafe ist. Also besser die static Variable direkt mit new Class() initialisieren. Die Abfrage auf null fällt dann auch weg. Zusätzlich die getInstance()-Methode noch syncronized...

greetz
SLi
 

DennisXX

Bekanntes Mitglied
Manche schreiben das = null mit dazu, weil es verdeutlich, dass die jeweilige Referenz auf nichts zeigt, man kann es aber auch ganz einfach weglassen.

Ok danke ! Um nochmal festzuhalten. Die Anwendung der "null Referenz" bringt mir als Entwickler also keine erweiterten Programmiermöglichkeiten / Programieroptionen, sondern dient nur dazu, um den Quellcode besser lesbar zu machen?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Mehrere Objekte anlegen Java Basics - Anfänger-Themen 23
B Klassen Objekte während der Laufzeit dynamisch anlegen Java Basics - Anfänger-Themen 8
R mehrere Objekte in Schleife anlegen? Java Basics - Anfänger-Themen 4
G Objekte mittels Schleife anlegen und ansprechen Java Basics - Anfänger-Themen 8
S Objekte dynamisch anlegen Java Basics - Anfänger-Themen 3
I Zapier -> wie werden Objekte gespeichert? Java Basics - Anfänger-Themen 10
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
K Hab ich dass so richtig erklärt (Objekte und Referenzen)? Java Basics - Anfänger-Themen 5
J Objekte in JSON speichern?? Java Basics - Anfänger-Themen 1
I Objekte in ShareProject speichern um später zu nutzen Java Basics - Anfänger-Themen 4
J Objekte Java Basics - Anfänger-Themen 22
T Objekte mit arrays erstellen Java Basics - Anfänger-Themen 6
Hzrfa Objekte, Referenz Java Basics - Anfänger-Themen 5
T 3D Objekte verarbeiten Java Basics - Anfänger-Themen 2
N Welche Objekte kann man zu einem Set hinzufügen Java Basics - Anfänger-Themen 4
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
W Objekte einer ArrayList in txt-datei schreiben mit Paths? Java Basics - Anfänger-Themen 2
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
E Objekte löschen Java Basics - Anfänger-Themen 9
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
B Objekte verschwinden beim Übersetzen Java Basics - Anfänger-Themen 5
D Zwei verschiedene Intellij Projekte, wie benutze ich wechselseitig objekte Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
F Aus eingelesener Datei korrekt Objekte erzeugen Java Basics - Anfänger-Themen 5
G Übergeordnete Objekte abrufen Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
B Objekte, bspw. konkret Arraylists,manuell aus Speicher löschen? Java Basics - Anfänger-Themen 70
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
D Wie Objekte im JFrame frei bewegen lassen? Java Basics - Anfänger-Themen 3
Spandeli8 Erzeugte Objekte gegenüber Bildern hervorheben in Java Processing Java Basics - Anfänger-Themen 1
J Zwei Objekte vergleichen Java Basics - Anfänger-Themen 8
L Werte von Objekte addieren Java Basics - Anfänger-Themen 14
U Objekte in LinkedList löschen und editieren Java Basics - Anfänger-Themen 14
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
G Methoden Informationen aus zwei Objekte bekommen? Java Basics - Anfänger-Themen 6
P Globale Objekte Java Basics - Anfänger-Themen 2
C Nachträglich neue grafische Objekte hinzufügen Java Basics - Anfänger-Themen 7
D Interaktion zweier Objekte Java Basics - Anfänger-Themen 5
M Objekte in Array speichern und ausgeben Java Basics - Anfänger-Themen 17
S Objekte indiziert erstellen Java Basics - Anfänger-Themen 27
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
N Typebound Objekte einer Arraylist hinzufügen Java Basics - Anfänger-Themen 7
A (Objekte Java Basics - Anfänger-Themen 6
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
U Objekte in einer LinkedList sortieren Java Basics - Anfänger-Themen 5
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
G Java Objekte auf Duplikate testen Java Basics - Anfänger-Themen 4
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
M Implementieren einer Datenstruktur, welche nur 5 Objekte speichert Java Basics - Anfänger-Themen 3
M Objekte miteinander vergleichen Java Basics - Anfänger-Themen 18
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
J Java GUI- Objekte Position per Quelltext bestimmen Java Basics - Anfänger-Themen 4
G Objekte in Methoden? Java Basics - Anfänger-Themen 13
H Auf Objekte bzw Variabeln aus einer anderen Methode zugreifen Java Basics - Anfänger-Themen 7
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
K Boolean in einer Methode um 2 Objekte zu vergleichen Java Basics - Anfänger-Themen 12
I Objekte Hilfe Java Basics - Anfänger-Themen 8
G Klassen und Objekte Java Basics - Anfänger-Themen 2
W Verschachtelte Objekte wieder auspacken Java Basics - Anfänger-Themen 3
R Attribute mehrerer Objekte ausgeben Java Basics - Anfänger-Themen 3
C Objekte und Konstruktoren Java Basics - Anfänger-Themen 2
F Erstellen zweier Objekte mit dem selben Inhalt Java Basics - Anfänger-Themen 1
O ObjectOutputStream Anzahl Objekte festhalten Java Basics - Anfänger-Themen 17
R Objekte aus Array als String + kommasepariert speichern Java Basics - Anfänger-Themen 12
X Objekte einer ArrayList richtig ausgeben? Java Basics - Anfänger-Themen 8
J Best Practice Dateiinhalte validieren und auf Objekte mappen Java Basics - Anfänger-Themen 3
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
der_Schokomuffin Hilfe gesucht beim Thema Objekte übergeben! Java Basics - Anfänger-Themen 2
S Konstruktor, Objekte Java Basics - Anfänger-Themen 4
PaperHat Objekte in Array vergleichen Java Basics - Anfänger-Themen 9
B HTML Code / Seite auslesen und JAVA Objekte erstellen Java Basics - Anfänger-Themen 12
PaperHat Programmieraufgabe - Objekte in Objekten Java Basics - Anfänger-Themen 2
E Methode mit Parametern um Objekte zu übergeben Java Basics - Anfänger-Themen 4
V Collections Objekte einer ArrayList in der main() ausgeben Java Basics - Anfänger-Themen 9
T Klassen Klassenübergreifende Objekte erstellen lassen Java Basics - Anfänger-Themen 5
A Objekte verknüpfen Java Basics - Anfänger-Themen 2
M Objekte mit einer Schleife mehrmals erzeugen Java Basics - Anfänger-Themen 17
B Klassen Alle Unter-Objekte durchlaufen in der Hauptklasse Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
S Zählen der Zeiger auf Objekte Java Basics - Anfänger-Themen 35
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
B Erste Schritte Objekte von JFrame der Fenstergröße anpassen Java Basics - Anfänger-Themen 3
M Klassen und Objekte Java Basics - Anfänger-Themen 2
J Objekte und Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Array Objekte einer Klasse zuordnen Java Basics - Anfänger-Themen 15
H Interface Objekte speichern und laden (serialisieren/deserialisieren) Java Basics - Anfänger-Themen 1
Orkanson Objekte in ein Array einfügen Java Basics - Anfänger-Themen 5
X Objekte in ArrayList einfügen Java Basics - Anfänger-Themen 10
L Vorherige Objekte zählen und ausgeben Java Basics - Anfänger-Themen 11
Orkanson Objekte und Klassen Java Basics - Anfänger-Themen 8
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
D Objekte-Fragen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben