2013-07-27 2 views
2

моей проблемы:Java статические методы/полей в интерфейсе

  • У меня есть куча различных классов всех расширений базового класса (Identifiable).
  • мне нужно назначить некоторые из подкласса определенное значение (securityLevel), который должен быть изменяемым и назначен всем членам класса (т.е .: он должен быть static).
  • Мне нужно получить доступ к классам через общий предок.
  • Как это сделать?

Первое, что пришло на ум, чтобы иметь специальный interface (ISecurity) определение либо значения или статический метод доступа к ним, и пусть реальные классы либо не implements его и, если они делают, чтобы переопределите поле static (или способ его извлечения). Однако это невозможно по двум причинам:

  1. Текущий язык Java не позволяет static членов в interface с.
  2. Даже если это позволит, это будет невозможно @Override.

Как я могу задать код вокруг проблемы? Единственный способ я нашел:

  • добавить не- static элемент (public Class getValueProvider()) для базового класса, чтобы получить значение возвращающегося null.
  • в интересующих классах @Override метод не static, возвращающий значение private static Class getValueProvider() реализующих сеттеров и геттеров для требуемого значения.
  • используйте извлеченный экземпляр class для получения запрашиваемого значения (или пропустите все, если возврат равен нулю).

Это очень уродливо, и нет возможности обеспечить правильную реализацию в подклассах.

+1

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

+0

На самом деле ваше «уродливое» решение было тем, что пришло на ум при чтении вашего вопроса. Как насчет того, чтобы показать нам какой-то клиентский код, чтобы мы могли лучше понять, что вы хотите выглядеть лучше – Bohemian

ответ

0

Вы можете попробовать использовать тип сервиса/фабрики.Или есть какое-то объект класса, который хранит ценную бумагу (SecuritySettings) и отправить в текущем Identifiable объекта, чтобы получить уровень безопасности

public class Identifiable { } 
    public class SampleUser extends Identifiable { } 
    public class ExampleUser extends Identifiable { } 

    public class UserService 
    { 
     public int SampleUserSecurity = 0; 
     //Or an array/dictionary structure 

     public int GetSecurityLevel(Identifiable user) 
     { 
      if(user instanceof SampleUser) 
      { 
       return SampleUserSecurity; 
      } 
     } 

     public SampleUser CreateSampleUser() 
     { 
      return new SampleUser(); 
     } 

     public ExampleUser CreateExampleUser() 
     { 
      return new ExampleUser(); 
     } 
    } 
+0

Спасибо. Я использовал вариант темы. – ZioByte

0

Вы можете определить Identifiable как abstract class. Кроме того, вы можете определить еще один abstract class, который расширяет Identifiable и придерживается ваших ограничений, т. Е. Содержит static variable и любые методы, которые могут потребоваться.

+0

Я уже думал об этом; К сожалению Identifiable является автоматически сгенерированным классом, и я могу только добавить что-то в конце. – ZioByte

0

Я бы постарался избежать статических элементов. Статические члены в java всегда неуклюжи (вы не можете переопределить их только скрыть и т. Д.)

Я не уверен, насколько я понимаю вашу проблему, но я предлагаю вам построить объекты с помощью контекстного интерфейса или что-то в этом роде. Затем объекты могут обращаться к этому контекстному интерфейсу, если они разрешают возвращать значение или должны возвращать специальное значение.

Тот, кто создает все эти объекты, может передать один и тот же объект и таким образом контролировать поведение. Этот объект может быть затем сохранен как статический (например, singelton)

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