2016-12-30 2 views
0

Я ищу хороший способ реализации иерархической структуры строк с использованием перечислителей или (абстрактных) классов.Иерархическая структура строк в Java. Каковы альтернативы для большого?

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

Я знаю, что некоторые альтернативы, например:

public abstract class FeaturePermissions { 

    public enum AppOne implements IEnum { 

     SomeFeature("permission name 1"); 

     private String name; 

     FeatureOne(String name) { 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 
    } 

    public enum AppTwo implements IEnum { 

     SomeFeature("permission name 2"); 

     private String name; 

     AppTwo(String name) { 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 
    } 

} 

И я могу позвонить с помощью:

FeaturePermissions.AppOne.SomeFeature.getName() 

Но я хотел бы отделить AppOne и AppTwo в разных файлах перечислений, но сохраняющий вызов выше, потому что это перечисление будет действительно большим в будущем (например, 200 записей каждый).

Я буду использовать это в коде в двух ситуациях.

  1. Аннотация: @HasPermission(FeaturePermissions.AppOne.SomeFeature.getName())
  2. Условный: if(user.hasPermission(FeaturePermissions.AppOne.SomeFeature.getName())

Какой самый лучший способ сделать это? И если мне нужно больше «уровней», например, FeaturePermissions.AppOne.BigFeature.SomeFeature.getName(), какая лучшая стратегия?

Спасибо!

+3

Возможно, вам нужна карта? –

+2

Звучит плохой дизайн, который не будет хорошо масштабироваться. – duffymo

+0

@duffymo, и это не очень хороший дизайн. Но эти разрешения, сегодня, находятся по всему коду и дублируются. Я пытаюсь собрать их, но я принимаю другие решения :) – Dherik

ответ

-2

Предлагаю использовать Карты. Вы можете вложить карты и легко хранить их как json во многих базах данных. Это избавит вас от написания большого количества шаблонов.

Вы можете использовать клавиши HashMap и String или ключи EnumMap и enum.

+0

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

+0

@Robert: в настоящее время все современные СУБД поддерживают JSON. А в Postgres вы даже можете хранить карту непосредственно в колонке 'hstore'.Но вопрос нигде не упоминает о хранении в базе данных в первую очередь. –