2012-05-18 3 views
2

Учитывая объект, как проверить, является ли класс Singleton или нет?Как определить, является ли класс одноэлементным классом из объекта?

В настоящее время я использую этот

public class SingletonClass implements IsSingleton 

где IsSingleton является пустым интерфейсом, который я реализую на одноэлементных классах. Таким образом, класс может быть протестирован как singleton

SingletonClass obj = SingletonClass.getInstance(); 
if(obj instanceof IsSingleton) 
    System.out.println("Class is Singleton"); 
else 
    System.err.println("Class not singleton"); 

Есть ли лучший способ определить класс Singleton. Я пробовал свой путь через reflection, но проблема в том, что есть getConstructors() только возврат объявлен общественных классов. Таким образом, он будет рассматривать класс без объявленного конструктора как Singleton.

+0

Я не эксперт по java, но если это способ программно проверить, является ли конструктор объекта закрытым или нет (через отражение, возможно), вот как я его протестировал. – Kristian

+4

@Kristian - есть способ проверить это, но частный конструктор не гарантирует, что класс является одноэлементным.вы все равно можете построить столько, сколько хотите, через статический метод для указанного объекта. – jtahlborn

+1

Наличие частного конструктора не обязательно означает, что класс реализован как одноэлементный. – birryree

ответ

4

Singleton - это семантическое определение, которое обычно не проверяется через код. Никакой интерфейс или любая другая схема не могут гарантировать, что класс работает исключительно как одиночный.

Из-за этого (смыслового характера), было бы лучше, ИМО для создания аннотаций для указания этой характеристике

+0

+1 для более четкого объяснения. –

1

Это выглядит очень сложно.

Java поддерживает «InstanceOf»

SingletonClass obj = SingletonClass.getInstance(); 
if(obj instanceof IsSingleton) 
    System.out.println("Class is Singleton"); 
else 
    System.err.println("Class not singleton"); 
2

нет вообще способа программно знать, если класс одноэлементен или нет.

1

instanceof должен работать с интерфейсами.

SingletonClass obj = SingletonClass.getInstance(); 

if (obj instanceof IsSingleton) 
    System.out.println("Yay !"); 

Но будьте осторожны!

http://www.xyzws.com/Javafaq/how-does-instanceof-work-with-interface/67

Это не будет работать, если объект из выпускного класса, как String. Для ваших пользовательских классов, если вы не сделаете сам класс окончательным, все должно быть хорошо.

1

Я думаю, что это может помочь вам .... Всякий раз, когда какой-либо объект создается в памяти, есть всегда является хэш-кодом, связанным с ним. Этот хэш-код вычисляется с помощью математической операции с использованием нескольких параметров, таких как начальный адрес выделения памяти. Таким образом, если вы вызовете hashcode() на любом объекте сколько угодно раз, он вернет тот же хэш-код. Итак, просто вызовите метод, возвращающий ваш ожидаемый одноэлементный тип объекта, и вызовите метод hashcode() на нем. Если он печатает один и тот же хэш-код каждый раз, это означает, что это singleton, иначе это не так.

Многие люди говорят, что ключевое слово instanceof может помочь вам решить, является ли объект singleton ot not. Но, я действительно не понимаю, как это возможно? instanceof просто позволяет нам проверить, является ли экземпляр каким-либо конкретным классом. Итак, если есть несколько экземпляров класса A, и они не созданы одноэлементным шаблоном, то проверка instanceof для любого из них всегда возвращает true. Но его нельзя назвать одиночным, потому что отдельный экземпляр существует для каждого объекта в памяти.

Смежные вопросы