SPiNMedlem sedan mars 20007 896 inlägg Hej!
Jag sitter och lurar här med ett par klasser, varav att en av dom inte ska gå att instansiera eller skapa fler instanser av. Jag har försökt med att lösa det genom s.k. Singleton's men får det inte att fungera...
Singleton.java
package mitt.paket;
public class Singleton {
private static Singleton singletonUniqueInstance;
private Singleton() {} // Det ska inte gå att skapa instanser av Singleton-klassen utifrån
public static Singleton getInstance() {
if( singletonUniqueInstance == null )
singletonUniqueInstance = new Singleton();
return singletonUniqueInstance;
}
}
So far, so good.
Klassen som ska ärva av Singleton, ska inte heller kunna instantieras - jag vill ha endast statiska metoder och fält här. Det blir ju lite problem...
package ett.annat.paket;
import mitt.paket.Singleton;
public class Luring extends Singleton {
private Luring() {} // Privat konstruktor
}
Problemet är, att med en superklass med privat konstruktor, så går inte det här så bra. Jag vill ju att man ska kunna hämta en Luring med getInstance() ärvd från Singleton.
Jag har också försökt med interface's, men där får man ju inte använda statiska fält eller metoder.
Visst skulle metoden getInstance() inte behöva vara statisk, så länge fältet singletonUniqueInstance är statisk, är det så jag blir tvungen att göra?
Har jag trasslat till det helt nu, för troligtvis finns det en jätteenkel lösning som jag inte ser. ;)
Synpunkter och råd tas gärna emot. :)
SPiNMedlem sedan mars 20007 896 inlägg Märkte nu att jag självklart kan använda nyckelordet 'protected' på Singleton's konstruktor. :)
Men jag tar ändå gärna emot synpunkter!
Peter SMedlem sedan dec. 20025 483 inlägg Du skulle ju kunna göra Singleton till en abstrakt basklass och på så sätt undvika skapandet av instanser av denna klass.
:)
SPiNMedlem sedan mars 20007 896 inlägg Jäpp, helt riktigt. Mitt huvud fungerar inte riktigt idag, känner jag. :)
Jag tror att det beror på bristen av öl, men det löser sig ju ikväll... ;)
Men vilket är att föredra? Om jag har en 'protected' konstruktor, så vet jag ju att endast samma klass, eller dess subklasser, skapar instansen. Det är ju relativt säkert, eftersom att den ändå inte går att nå utifrån:
import mitt.paket.Singleton;
public HeltAnnanKlass {
Singleton s;
...
public void doCrap() {
s = new Singleton();
}
}
Däremot kan de ju ärva av Singleton, och därefter skapa en instans... Men då vet jag ju att det ändå bara skapas en instans. Right?
:q
SPiNMedlem sedan mars 20007 896 inlägg Det kommer ju ändå inte att fungera som jag vill. Man kan ju skapa fler instanser än en, när man ärver. Inte bra. Man ska endast kunna komma åt den statiska metoden getInstance() ju.
public class Singleton {
private static Singleton singletonUniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if( singletonUniqueInstance == null )
singletonUniqueInstance = new Singleton();
return singletonUniqueInstance;
}
}
Det är så den klassen måste se ut. Det bästa hade varit om man skulle kunna använda statiska fält och metoder i Interface's, men nu går ju inte det...
Peter S, skulle du kunna visa din version i ett kod-exempel? Jag är för trött för att kunna komma på något vettigt. :)
Peter SMedlem sedan dec. 20025 483 inlägg Skall jag vara ärlig så är jag inte riktigt säker på vad du vill åstadkomma :)
Vad finns i klassen Singleton att ärva exempelvis?
Koden för denna klass garanterar dig iallafall att singletonUniqueInstance endast initialiseras en gång:
class Singleton {
private static Singleton obj = null;
protected Singleton() { /* ... */ };
public static Singleton createInstance() {
if (obj == null) obj = new Singleton();
return obj;
}
}
class Foo {
public static void main(String args[]) {
Singleton s1 = Singleton.createInstance();
Singleton s2 = Singleton.createInstance();
System.out.println("s1 == s2? " + s1.equals(s2));
}
}
:)