Programierstil: static - Zugriff vs. Staticzugriff

huckleberry

Bekanntes Mitglied
Hallo,

mir ist kein besserer Titel eingefallen.

Ich habe eine Singleton-Klasse:
Java:
public class MySingleton {
	
	private long myvalue;
	//private static long myvalue; 

	private MySingleton(){
		myValue = -1;
	}

	public static MySingleton getInstance(){
		if (mySingleton == null) mySingleton = new MySingleton();
		return mySingleton;
	}
	
	//..
}

Dabei muss ich eine Methode für andere Klassen zur Verfügung stellen. Hätte ich 2 Möglichkeiten.
a)
Java:
	public long calculatedValue(long l){
		return myValue+l;
	}
und dann rufe ich aus von woanders folgendes auf
Java:
	long test = MySingleton.getInstance().calculatedValue(3);

ODER b)
Java:
	public static long calculatedValue(long l){
		return myValue+l;
	}
und dann rufe ich aus von woanders direkt folgendes auf
Java:
	long test = MySingleton.calculatedValue(3);

Gibts es Vor- und Nachteile? Performance etc.?

VG Huck
 

HelgeW

Mitglied
Einen Singleton solltest Du einsetzen, wenn es innerhalb der Klasse gilt bestimmte Zustände zu merken oder Daten zu puffern, die ueber den einfachen Aufruf hinaus gehen ( z.B. Cache, Message etc. )

Bei Deinem Beispiel ist es ja nur eine einfache Berechnung und daher würde ich es als static methode implementieren.
 
M

maki

Gast
Ein einziges "GoF" Singleton macht zB. dann Sinn, wenn man keine Lust/Möglichekit hat ein DI Framework zu nutzen, mehere Singletons machen eingentlich keinen Sinn mehr, weil DI hier die bessere Wahl ist.

"GoF" Singletons werden meist falsch eingesetzt als globale Variablen, danach hört sich hier die Beschreibung an.

Wenn "GoF" Singletons Zustände halten, muss man auch synchronization achten, wenn sie keine Zustände halten, braucht man kein Singleton sondern eine statische Utilitymethode, oder besser eine stinknormales nicht-statisches Objekt ;)

Einen Singleton solltest Du einsetzen, wenn es innerhalb der Klasse gilt bestimmte Zustände zu merken oder Daten zu puffern, die ueber den einfachen Aufruf hinaus gehen ( z.B. Cache, Message etc. )
Hi HelgeW,

dafür "braucht" man kein "GoF" Singleton, geht besser ohne ;)
 
Zuletzt bearbeitet von einem Moderator:
B

bygones

Gast
warum brauchst du ueberhaupt eine instanz der klasse ? nach dem bsp hast du einfach eine reine static class ala Math.
 
G

Gast2

Gast

tfa

Top Contributor

Die "Gang of Four" haben das Buch Design Patterns geschrieben. Hier wird auch das Signleton-Muster vorgestellt. Da es so schön einfach und gut zu verstehen ist, wird es gerade von Anfängern gerne missbraucht.

Später hat Erich Gamma (einer der GoF) zugegeben, dass das Singleton eventuell doch eher ein Antipattern und kein Pattern ist:

When discussing which patterns to drop, we found that we still love them all. (Not really—I'm in favor of dropping Singleton. Its use is almost always a design smell.)

Quelle


Das war nur ein Beispiel. Mein Singleton ist selbstverständlich komplexer und beinhält ein Kommunikationsprotokoll, welches sich bestimmte Timeout Werte merkt.
Komplexität ist kein Grund, ein Singleton einzuführen. Versuch's einfach mal ohne.
 

FArt

Top Contributor
Tipps:
1. Vermeide Singletons dieser Art (wurde schon erwähnt)
2. Wenn ein Singleton nicht lazy initialisiert werden muss, dann initialisieren ihn sofort in einem static Field oder synchronisiere die Instanziierung (wurde so ähnlich schon erwähnt)
3. Mach dir keine Gedanken um Performance bei einfachen Zugriffen
4. Nutze eine DI Framework und verwende eine Instanz anstatt ein "Singleton" (wurde schon erwähnt)
5. und allgemein: KISS
 

ARadauer

Top Contributor
Wiederspricht sich 4 und 5 nicht gewalltig wenn man Anfänger ist?
Wiederspricht sich 4 in sich selbst nicht da eine normale "Spring Bean" ja auch ein Singleton ist?
 
M

maki

Gast
EikeB hat es zwar schon erklärt. wollte aber nochmal was dazu sagen...

Die "Gang of Four" haben in ihrem Buch das Singleton mit static Feld bzw. Zugriff gezeigt (getInstance bzw. INSTANCE), inklusive LazyLoading (was eigentlich fast nie Sinn macht, dafür aber den Code komplexer und fehlerträchtiger) und privatem Konstruktor. Leider wird dieses beispiel meist ohne Nachzudenken abgetippt... inkl. aller negativen Eigenschaften (static Zugriffe sind schwer zu testen, hartcodierte Abhängigkeit, fehlende/falsche Synchronization für das LazyLoading, "Seperation of Concerns" ist verletzt, weil Zugriff und Erzeugung im Gof Singleton beide geregelt werden) :(

Bei einem DI Framework sagt man eifnach "das ist ein Singleton, also immer dieselbe Instanz verwenden", kein static Zugriff bzw. static Feld, kein privater Konstrutor, keine der Nachteile wie zB. schlechte Testbarkeit, einfach nur eine normale Klasse von dem nur eine Instanz erzeugt wird vom DI Framework: sauberer, testbar, einfacher -> besser

Wiederspricht sich 4 und 5 nicht gewalltig wenn man Anfänger ist?
Wiederspricht sich 4 in sich selbst nicht da eine normale "Spring Bean" ja auch ein Singleton ist?
Hi ARadauer,

so schwer ist DI auch nicht, geht auch ohne Framework, bei Konstruktor bzw. Setter Injection ohne Framework fällt einem zB. schnell auf falls etwas von überall und jedem verwendet wird -> Vielleicht doch etwas die Sichtbarkeit einschränken abnstatt eine globale Varibale zu verwenden? ;)
Ansonsten gibt es große Unterschiede zwischen einem Singleton und einem "Gof Singleton" ;)
 
Zuletzt bearbeitet von einem Moderator:

ARadauer

Top Contributor
Ncihts gegen DI ich arbeite gerne mit Spring. Trotzdem muss man sich bewusst sein, dass man mit Singletons arbeitet. Überhaupt im Web Bereich!
 
M

maki

Gast
@ARadauer
Siehe Nachtrag, Gof Singleton ist "böse" wegen den erwähnten Nachteilen, DI nutzt "gute" Singletons, also solche ohne die erwähnten negativen Effekte.
 

FArt

Top Contributor
Wiederspricht sich 4 und 5 nicht gewalltig wenn man Anfänger ist?
Wieso widersprechen und gewaltig? Wieso Anfänger?
KISS sollte allgemein gelten und ist relativ. Das erwähnte Singleton Pattern ist ja auch nicht verboten sondern "nur" schlecht. Wenn es die einfachste Lösung ist, dann darf man sie wählen. Man sollte aber gleich darauf hinweisen, dass diese vermeintlich einfache Lösung mehr Nachteile mit sich bringt und somit nicht die beste Wahl ist. Ist eine Lösung "einfacher", weil sie im Code so einfach aussieht? Nein, sie ist (wie man an obigem, falschen Code sieht) fehleranfällig und schlecht zu testen. Vielleicht sollten wir in dem Zusammenhang nicht von DI sondern von IoC reden, das passt vielleicht besser, ist einfach zu realisieren und kommt (mit nur einer Instanz) ohne Singleton Pattern aus. (Übrigens auch ohne Spring, Pico Container, CDI, ...). Es geht auch ganz alt hergebracht mit pure Java.

Wiederspricht sich 4 in sich selbst nicht da eine normale "Spring Bean" ja auch ein Singleton ist?
Spring Bean ist normal und ein Spring Bean als Prototype ist nicht normal? ;-)
Deshalb habe ich "Singleton" bei Punkt 4 in Anführungszeichen geschrieben, zur Unterscheidung vom Singleton Pattern und einer einzelnen Instanz.
 

Marco13

Top Contributor
Ein möglicher Nachteil, je nachdem, wie suggestiv dieses Beispiel war: Man kann bei einer static-Methode keine Polymorphie einsetzen.
 
B

bygones

Gast
Ncihts gegen DI ich arbeite gerne mit Spring. Trotzdem muss man sich bewusst sein, dass man mit Singletons arbeitet. Überhaupt im Web Bereich!
Di ist nicht exklusiv Spring.

Ansonsten - NICHT schon wieder eine Ja-Singleton-Nein-Singleton - gibts dazu nicht schon genuegend threads hier und auf der welt ?!
 

xehpuk

Top Contributor
Und wo ist der Nachteil ?

Google: prefer delegation over inheritance
Jau, ohne
Code:
interface
,
Code:
extends
und
Code:
implements
wäre alles besser. Und alle Methoden sind immer
Code:
static
. :bahnhof:

Was ich damit sagen will: Dein Einwand war viel zu plump.
 
B

bygones

Gast
Jau, ohne
Code:
interface
,
Code:
extends
und
Code:
implements
wäre alles besser. Und alle Methoden sind immer
Code:
static
. :bahnhof:

Was ich damit sagen will: Dein Einwand war viel zu plump.
er hat recht mit seiner Aussage, auch wenn er diese meiner Ansicht nach ueberzieht. Prefer bedeutet nicht ausschliesslich.

Man sollte auf alle Faelle in Klassen die fuer Vererbung vorgesehen sind auf static nahezu verzichten.
 

tfa

Top Contributor
Google: constant interface antipattern
Das ist ein Interface, dass nur Konstanten defininiert und keine Methoden. Ich seh hier den Zusammenhang nicht.

Manchmal (je nach Plattform auch relativ häufig) hat man Interfaces, gegen die man entwickeln muss - auch völlig ohne Vererbung. Und da kommt man mit static nicht weit.
 
F

Firephoenix

Gast
Für kleinere Sachen muss man aber auch nicht gleich DI-Frameworks rausholen sondern kann die Objekte auch noch per Hand verschalten ;)

Ausreichen tut ja schonmal das Konzept, dass man Abhängigkeiten im Konstruktor an mehrere Objekte übergibt, damit spart man sich recht schnell solche Singletons.

Gruß
 

huckleberry

Bekanntes Mitglied
Kannst du die Klasse mal zeigen? Muss das wirklich nen Singleton sein?

Ich will die Properties halt bei jedem Aufruf nur ein einzges mal parsen (zu Beginn), ab dann wann es gebraucht wird.. Sag du es mir :D

Java:
package de.utils.configparsers;

import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

public final class ConfigReader {

	private static final 	Logger 			LOG = LoggerFactory.getLogger();

	private final static 	String			FILE_CONF = "config.props";
	
	private static 			ConfigReader	_cr = null;
	
	private static 			Properties		_properties = null;
	
	private static 			String 			pathMC;
	private static 			String 			uriConfigFile;
	
	private static 			long			conf_receipt_period = DefaultConstants.RECEIPT_PERIOD ;
	private static 			int				conf_mc_addr = DefaultConstants.MicroCtrllr_ADDR;
	private static 			String 			conf_correct_response = DefaultConstants.RESPONSE_CORRECT_GATEWAY;
	private static 			int 			conf_offset_year = DefaultConstants.OFFSET_YEAR;
	private static 			int 			conf_offset_month = DefaultConstants.OFFSET_MONTH;
	
	
	private ConfigReader(){
        pathMC = System.getProperty("conf.path");
        LOG.logDebug("pathMC {0}", pathMC);
        
        uriConfigFile = pathMC + "/" + FILE_CONF;
        LOG.logDebug("uriConfigFile {0}", uriConfigFile); 

        _properties = new Properties();

	}
	
	public static ConfigReader getInstance(){
		if (_cr == null) _cr = new ConfigReader();
		return _cr;
	}

	public long get_receipt_period() { return conf_receipt_period; }

	public int get_MC_addr() { return conf_mc_addr; }

	public String getCorrect_Response() { return conf_correct_response; }

	public int getOffset_Year() { return conf_offset_year; }

	public int getOffset_Month() { return conf_offset_month; }

	public void parseINI() throws ParseErrorException{
		if (_properties != null) try{
			_properties.load(new FileInputStream(uriConfigFile));
	        
			conf_receipt_period = 	Long.parseLong( _properties.getProperty("RECEIPT_PERIOD") );
	        conf_mc_addr = 			Integer.parseInt( _properties.getProperty("MC_ADDR") );
	        conf_correct_response = _properties.getProperty("RESPONSE_CORRECT_GATEWAY");
	    	conf_offset_year = 		Integer.parseInt( _properties.getProperty("DATE_OFFSET_YEAR") );
	    	conf_offset_month = 	Integer.parseInt( _properties.getProperty("DATE_OFFSET_MONTH") );
		} catch (Exception e) {
			LOG.logError("Excedption @ parseINI(): {0} !!!", e.getLocalizedMessage());
	    } else LOG.logError("_properties is NULL !!!");
	}	
}
 
Zuletzt bearbeitet:
M

maki

Gast
So nebenbei bemerkt, dein Code erinnert mich an eine Mischung aus C und PL/1, Java hat andere Code Conventions ;)
 

FArt

Top Contributor
Der Code hat einiges an Macken (nicht nur optisch).

Warum lieferst du ein Singleton (immer noch unsynchronisiert und somit falsch) und parst nicht sofort auch die Properties? So ist die Methode dazu public und kann beliebig oft (und auch konkurrierend) aufgerufen werden.

Die Klasse hat einen ungünstigen Namen (ist kein Reader) und die parse-Methode auch. Die Klasse ist vermutlich eher ein ConfigurationProvider (stellt Konfiguratswerte bereit) und parse sollte private sein und beim Erstellen der Instanz einmalig aufgerufen werden.
So hast du auch das Problem, dass u.U. die Getter vor dem Parsen aufgerufen werden können und somit ein falsches Ergebnis liefern.

In der Regel ist es flexibler, Properties über den Classloader zu laden und nicht aus dem Filesystem.

Streams solltest du immer auch schließen, wenn du mit der Verarbeitung fertig bist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Methoden abstract static Methode Allgemeine Java-Themen 8
N nicht static und auch nicht new Allgemeine Java-Themen 3
P static Blocks und variablen Allgemeine Java-Themen 41
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
K Static Variablen verbieten Allgemeine Java-Themen 10
C Generic collections und static typing Allgemeine Java-Themen 4
M Warum nicht static ? Allgemeine Java-Themen 10
M Eine static-Methode verlassen Allgemeine Java-Themen 2
B Schlüsselworte [ERLEDIGT] static { } - Was ist das und wofür kann ich das brauchen? Allgemeine Java-Themen 1
J private static final String variable Allgemeine Java-Themen 8
L Non-static-Variables in Enumerationen Allgemeine Java-Themen 2
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
T Static kann nicht verändert werden Allgemeine Java-Themen 3
W Threads Cannot make a static reference.. Allgemeine Java-Themen 13
N Static oder andere Lösung Allgemeine Java-Themen 5
N Vererbung Static & private fields - Nicht ganz einfach? Allgemeine Java-Themen 4
M Wo hin mit static factory methods? Allgemeine Java-Themen 40
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
K Static - Problem Allgemeine Java-Themen 10
M Variablen Variablenzugriff aus static void Allgemeine Java-Themen 21
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
S static methoden Allgemeine Java-Themen 9
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
X HTTP Problem mit static/non static JTextArea Update Allgemeine Java-Themen 17
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
B static Variable / Unterklasse Allgemeine Java-Themen 2
I Was macht static { ... } ? Allgemeine Java-Themen 8
G static inner Klassen Allgemeine Java-Themen 7
G static und dynamic linking? Allgemeine Java-Themen 32
J in einer static Variable Wert ändern Allgemeine Java-Themen 6
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
G static- Methoden überschreiben Allgemeine Java-Themen 10
E Geschwindigkeit static Allgemeine Java-Themen 6
V Static oder wie? Allgemeine Java-Themen 61
I reflection get inner static classes Allgemeine Java-Themen 2
L static main - Spezifikation? Allgemeine Java-Themen 7
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
D static Allgemeine Java-Themen 46
P static-Methode aus dem Konstruktor aufrufen Allgemeine Java-Themen 6
oliver1974 "(.) should be accessed in a static way" Falsche W Allgemeine Java-Themen 6
P static Klassenvariable Allgemeine Java-Themen 15
B JPasswordField klassenübergreifend auslesen->static Probl Allgemeine Java-Themen 4
F Methoden: static vs. instance Allgemeine Java-Themen 24
MQue static Methoden/Klassen Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
G Java-Befehle Native und Static Allgemeine Java-Themen 2
conan2 static-Block in Klassen Allgemeine Java-Themen 6
M JNI, static.a mit load.Library laden? Allgemeine Java-Themen 2
K Static Members von Superklasse für JEDEN Erben Allgemeine Java-Themen 6
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
M static-Methode vorschreiben Allgemeine Java-Themen 5
S singleton vs. static Allgemeine Java-Themen 7
G Object mit static Feldern speichern Allgemeine Java-Themen 9
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
P Singleton vs static Allgemeine Java-Themen 19
J parameterized und static fields Allgemeine Java-Themen 4
A Static reference to non-static field Allgemeine Java-Themen 10
S static umgehen Allgemeine Java-Themen 5
G static oder nicht Allgemeine Java-Themen 4
J Problem mit static/non-static Allgemeine Java-Themen 2
G getAppletContext() in static Methode Allgemeine Java-Themen 3
m@nu Programm-Models in Static-Objekten speichern Allgemeine Java-Themen 5
J Nicht-static variable in static variable kopieren - wie? Allgemeine Java-Themen 14
O does not declare a static final serialVersionUID field of . Allgemeine Java-Themen 6
G static vor einem array Allgemeine Java-Themen 2
K Überschreiben von 'static'-Methoden hat anderes Verhalten? Allgemeine Java-Themen 2
A JSP & static-Variablen Allgemeine Java-Themen 3
B Static Import: Syntaxfrage Allgemeine Java-Themen 2
S Static + Speicher + Bytecode etc. Brauche HILFE :/ Allgemeine Java-Themen 11
Z auf static Methode aus anderen Package zugreifen? Allgemeine Java-Themen 7
N this im public static void Allgemeine Java-Themen 3
C Communication zwischen zwei Projekte - static objects Allgemeine Java-Themen 4
S static mit abstract und in interface Allgemeine Java-Themen 10
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
W Klassen Zugriff auf ein Textfile aus allen Klassen. Allgemeine Java-Themen 2
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Java Zugriff auf Netzwerklaufwerk Allgemeine Java-Themen 1
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
O Zugriff auf mySQL ohne JDBC Allgemeine Java-Themen 3
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
B Maven Zugriff auf files aus einem kompilierten jar Allgemeine Java-Themen 15
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
W Zugriff auf Objektvariablen vs. Übergabe Allgemeine Java-Themen 3
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
Tommy Nightmare HTTP Zugriff auf Internetseite im Loginbereich Allgemeine Java-Themen 5
H Zugriff auf PHP Allgemeine Java-Themen 4
B DB-Zugriff einer Webanwendung funktioniert nicht mit Java 7 Allgemeine Java-Themen 2
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben