2015-04-28 3 views
1

Я задавался вопросом, можно ли вызвать из POJO метод oneton bean-компонента через его интерфейс. Возможно, эта идея неправильная или архитектура ... но это то, что я хотел бы сделать, если это возможно, потому что это архитектура проекта. Я замечаю, что когда я вызываю getInstance() (метод из интерфейса singleton) из POJO, возникает ошибка, говорящая мне, что метод должен быть статическим, но если я сделаю метод статическим, тогда я должен написать реализацию в интерфейсе, и я не могу получить экземпляр singleton.Как вызвать метод singleton из Java POJO?

+1

Удалите интерфейс и сделайте метод статическим. Вы не можете вызвать метод экземпляра, прежде чем у вас будет фактический экземпляр для его вызова, и вы не хотите называть его экземпляром. – Stultuske

ответ

2

Ваш текущий подход с интерфейсом является ошибочным. По умолчанию все методы в интерфейсе (вплоть до Java 8) являются статическими и реализуются методами экземпляра в классе реализации.

Это означает, что это не вариант. В конце концов, вам нужно запустить метод для создания экземпляра, то есть у вас пока нет экземпляра, так что у вас нет экземпляра для его вызова.

Внесение того же статического метода в абстрактный класс, который вы расширяете, также не является решением: суперкласс никогда не должен знать о его подклассах. Если это статический метод (который он должен быть), вам нужно сохранить его в самом классе: статический метод в абстрактном классе может (посредством анонимной реализации абстрактного класса) возвращать экземпляр абстрактного класса, но это не то же самое, что и экземпляр подкласса, и это то, что вы ищете.

Чтобы использовать этот метод для подкласса, вам необходимо наследовать его из суперкласса. Но он все равно вернет экземпляр суперкласса. Вам нужно будет перезаписать метод в подклассе правильным, поэтому лучшим решением будет добавить его прямо в ваш класс Singleton.

-1

Идея кажется неправильной. Статический метод всегда находится на уровне класса, и поэтому вы никогда не сможете объявить метод статическим в интерфейсе Java (это можно сделать в Java 8). Однако это похоже на неправильный дизайн. Если вы действительно хотите сделать что-то вроде этого -

1)Make the Interface an abstract class. 
2)Create a static method called getInstance(); 
3)Extend the abstract class in your POJO singleton class. 

Надеюсь, что это поможет!

+0

, так как он должен был бы перезаписать (вы не можете переопределить статические члены) метод, чтобы вернуть экземпляр самого класса, какова точка этого? Наличие абстрактного класса в этой ситуации бессмысленно. Все, что ему нужно, это один статический метод в самом классе. – Stultuske

+0

Абстрактный класс не только для статического метода. В настоящее время он имеет интерфейс, который будет содержать несколько сигнатур методов, которые класс, реализующий этот интерфейс, должен переопределить. Он может все еще иметь все те, что в этом абстрактном классе, и использовать статический метод. P.S - Этот ответ заключается только в том, что он хочет сделать это таким образом, в идеале он должен иметь статический метод в одиночном классе – Pratik

+0

В идеале он должен быть там, точка.суперкласс не знает о существовании подклассов, поэтому абстрактный класс вернет экземпляр ... что, собственно? он не может вернуть один из себя, если он не является анонимным, и он не может логически вернуть экземпляр класса, который ему нужен. В любом случае, вы его включаете, он все еще нуждается в этом статическом методе в своем одиночном классе. – Stultuske

1

Вам не разрешено иметь статические методы в ваших интерфейсах (по крайней мере, до Java 8). Что-то вроде этого недопустимо:

MyInterface var = new MyImplementingClass(); 
var.staticMethod(); 

Просто удалите интерфейс и вызовите статический метод против класса, в котором находится статический метод.

Поиск по singleton pattern - «стандартный» способ сделать это включает в себя классы, а не интерфейсы, поэтому переосмыслите свой дизайн.

+0

'' стандартный способ сделать это включает в себя классы или перечисления – CKing

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