---
title: "Tillåta en instans av objekt"
type: "forum-thread"
url: "https://www.webforum.nu/amne/java/84794-tillåta-en-instans-av-objekt"
topic: "Java"
topic_url: "https://www.webforum.nu/amne/java"
author: "SPiN"
published: "2003-08-29T12:57:04.000Z"
updated: "2003-08-30T07:11:40.000Z"
replies: 5
views: 227
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/java/84794-tillåta-en-instans-av-objekt"
---

# Tillåta en instans av objekt

## #1 — SPiN, 2003-08-29T12:57Z

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. :)

Permalänk: https://www.webforum.nu/p/84794

## #2 — SPiN, 2003-08-29T13:01Z

Märkte nu att jag självklart kan använda nyckelordet 'protected' på Singleton's konstruktor. :)

Men jag tar ändå gärna emot synpunkter!

Permalänk: https://www.webforum.nu/p/1141832

## #3 — Peter S, 2003-08-29T13:07Z

Du skulle ju kunna göra *Singleton* till en abstrakt basklass och på så sätt undvika skapandet av instanser av denna klass.

 :)

Permalänk: https://www.webforum.nu/p/1141835

## #4 — SPiN, 2003-08-29T13:11Z

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

Permalänk: https://www.webforum.nu/p/1141837

## #5 — SPiN, 2003-08-29T13:19Z

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. :)

Permalänk: https://www.webforum.nu/p/1141841

## #6 — Peter S, 2003-08-30T07:11Z

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));
     }
}
```

 :)

Permalänk: https://www.webforum.nu/p/1142097

---

Tråden på webben: https://www.webforum.nu/amne/java/84794-tillåta-en-instans-av-objekt
