Spencer
Spencer

Reputation: 4148

Java Singleton Pattern

Edit: Answered - error was method wasn't static

I'm used the Singleton Design Pattern

 public class Singleton {
   private static final Singleton INSTANCE = new Singleton();

   // Private constructor prevents instantiation from other classes
   private Singleton() {}

   public static Singleton getInstance() {
      return INSTANCE;
   }
 }

My question is how do I create an object of class Singleton in another class?

I've tried:

Singleton singleton = new Singleton(); 
// error - constructor is private
Singleton singleton = Singleton.getInstance();
// error - non-static method cannot be referenced from a static context

What is the correct code?

Thanks, Spencer

Upvotes: 17

Views: 28272

Answers (8)

user
user

Reputation: 11

It is still possible to create more than one instance of the class, as follows:

Singleton.getInstance().clone()

Upvotes: 1

Patrik
Patrik

Reputation: 1

since getInstance() method is "static" and instance field too, yo can use Singleton.getInstance(); Without creating new exeple of class. Thihs is the poit of singletone

Upvotes: 0

user1646438
user1646438

Reputation:

Since we doesn't want to allow more than one copy to be accessed. So We need to manually instantiate an object, but we need to keep a reference to the singleton so that subsequent calls to the accessor method can return the singleton (rather than creating a new one). Thats why is

Singleton singleton = Singleton.getInstance();

Correct way to access any singletonObject.

Upvotes: 2

Vaishak Suresh
Vaishak Suresh

Reputation: 5845

  1. since the constructor is private, it does not make sense to create an object using the constructor.
  2. you should be using public static Singleton getInstance(), but the implementation is not very correct.

    if (instance == null) {
    instance = new Singleton();
    }
    return instance;

This is how you should be doing it. This ensure that it creates the instance if it does not exist, or simply returns the existing instance. Your code would also do the same thing, but this add to the readability.

Upvotes: 2

Bozho
Bozho

Reputation: 596996

Singleton singleton = Singleton.getInstance();

is the correct way. Make sure your getInstance() method is indeed static.

Since your Singleton implementation is far from being safe - your object can be instantiated via reflection, you may want to create a singleton based on enum

Upvotes: 26

vijay.shad
vijay.shad

Reputation: 2474

There is nothing wrong in using

Singleton singleton = Singleton.getInstance();
// error - non-static method cannot be referenced from a static context

This is the way to get the singleton object form the class. There must me something else. Please post some more details

Upvotes: 1

Etaoin
Etaoin

Reputation: 8714

Singleton singleton = Singleton.getInstance(); should work -- that error doesn't make sense, given your code; are you sure you're reporting it correctly? (It would make sense if you had forgotten to make the getInstance method static, which you've done in your code above.)

The code you've given us for the class is correct.

Lastly, one conceptual note: First, you aren't "creating an object of class Singleton" -- that's the whole point of a Singleton. :) You're just getting a reference to the existing object.

Upvotes: 3

Grzegorz Oledzki
Grzegorz Oledzki

Reputation: 24251

This one:

 Singleton singleton = Singleton.getInstance();

should work. This is how you call static methods in Java. And the getInstance() method is declared as static. Are you sure you are using the very same Singleton class? Or maybe you have imported a class called the same in some other package.

Upvotes: 2

Related Questions