Я могу добавить и удалить элементы перечисления во времени выполнения в Java

Разобрался! Вот что работает как в производстве , так и в симуляторе:)

match /myusers/{userId}/{allPaths=**} {
  allow write: if request.auth.uid == userId && 
                  (request.resource.size < 1 * 1024 * 1024 || request.method == 'delete');
  allow read: if request.auth.uid == userId;
}

p.s. @ Дуг Стивенсон, если вы можете подать заметку изнутри, я думаю, что было бы очень полезно для других, если бы request.method примеров с delete, update, get и / или create могли быть добавленным в документацию!

РЕДАКТИРОВАТЬ:

Кроме того, это работает как в симуляторе, так и в производстве (и, на мой взгляд, немного более читабельно, чем первый вариант). Благодаря @Doug Stevenson на кончике!

match /myusers/{userId}/{allPaths=**} {
  allow write: if request.auth.uid == userId && request.resource.size < 1 * 1024 * 1024;
  allow delete: if request.auth.uid == userId 
  allow read: if request.auth.uid == userId;
}
55
задан Community 23 May 2017 в 01:47
поделиться

6 ответов

Нет, перечисления, как предполагается, являются полным статическим перечислением.

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

В некоторых случаях Вы могли бы хотеть ряд стандартных значений, но позволить расширение. Обычный способ сделать это, имеют interface для интерфейса и enum, который реализует это interface для стандартных значений. Конечно, Вы теряете способность к switch, когда у Вас только есть ссылка на interface.

41
ответ дан Joachim Sauer 7 November 2019 в 07:27
поделиться

Позади занавеса перечисления являются POJOs с частным конструктором и набором общедоступных статических окончательных значений типа перечисления (см. здесь для примера). На самом деле, вплоть до Java5, это считали лучшей практикой для создания собственного перечисления этот путь, и Java5 представил enum ключевое слово как стенография. Посмотрите источник для Enum< T> для узнавания больше.

, Таким образом, это не должна быть без проблем для записи собственного 'TypeSafeEnum' с общедоступным статическим заключительным массивом констант, которые читаются конструктором или передаются ему.

кроме того, сделайте себе одолжение и переопределите equals, hashCode и toString, и, если возможно создайте values метод

, вопрос состоит в том, как использовать такое динамическое перечисление... Вы не можете считать значение "PI=3.14" из файла, чтобы создать enum MathConstants и затем идти вперед и использовать MathConstants.PI везде, где Вы хотите...

13
ответ дан Matt Lachman 7 November 2019 в 07:27
поделиться

Я столкнулся с этой проблемой на формирующий проект моей молодой карьеры .

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

я хотел свое решение быть похожим на это:

enum HatType
{
    BASEBALL,
    BRIMLESS,
    INDIANA_JONES
}

HatType mine = HatType.BASEBALL;

// prints "BASEBALL"
System.out.println(mine.toString());

// prints true
System.out.println(mine.equals(HatType.BASEBALL));

И я закончил с чем-то вроде этого:

// in a file somewhere:
// 1 --> BASEBALL
// 2 --> BRIMLESS
// 3 --> INDIANA_JONES

HatDynamicEnum hats = HatEnumRepository.retrieve();

HatEnumValue mine = hats.valueOf("BASEBALL");

// prints "BASEBALL"
System.out.println(mine.toString());

// prints true
System.out.println(mine.equals(hats.valueOf("BASEBALL"));

, Так как мои требования были то, что должно было быть возможно добавить участников к перечислению во времени выполнения, я также реализовал ту функциональность:

hats.addEnum("BATTING_PRACTICE");

HatEnumRepository.storeEnum(hats);

hats = HatEnumRepository.retrieve();

HatEnumValue justArrived = hats.valueOf("BATTING_PRACTICE");
// file now reads:
// 1 --> BASEBALL
// 2 --> BRIMLESS
// 3 --> INDIANA_JONES
// 4 --> BATTING_PRACTICE

я назвал это Динамическим Перечислением "шаблоном", и Вы читаете приблизительно первоначальный проект и его исправленное издание .

, которое различие между этими двумя - то, что исправленное издание было разработано после того, как я действительно запустил к grok OO и DDD. Первый, который я разработал, когда я все еще писал номинально процедурный DDD под нехваткой времени не меньше.

7
ответ дан moffdub 7 November 2019 в 07:27
поделиться

Можно загрузить класс Java из источника во времени выполнения. (Используя JCI, BeanShell или JavaCompiler)

Это позволило бы Вам изменять Перечислимые значения, как Вы желаете.

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

0
ответ дан Peter Lawrey 7 November 2019 в 07:27
поделиться

Вы могли попытаться присвоить свойства ПЕРЕЧИСЛЕНИЮ, Вы пытаетесь создать и статически создать его при помощи загруженного файла свойств. Большой взлом, но это работает :)

0
ответ дан Eldelshell 7 November 2019 в 07:27
поделиться

Мне нужно было сделать что-то подобное (для целей модульного тестирования), и я наткнулся на это - EnumBuster: http://www.javaspecialists.eu/archive/Issue161.html

Это позволяет добавлять, удалять и восстанавливать значения перечисления.

Правка : Я только начал использовать это и обнаружил, что для java 1.5 требуются некоторые небольшие изменения, с которыми я сейчас застрял:

  • Добавить статические вспомогательные методы массива copyOf (например, взять эти Версии 1.6: http://www.docjar.com/html/api/java/util/Arrays.java.html )
  • Измените EnumBuster.undoStack на стек
    • В undo () замените undoStack.poll () на undoStack.isEmpty ()? null: undoStack.pop ();
  • Строка VALUES_FIELD должна быть "ENUM $ VALUES" для перечислений java 1.5, которые я пробовал до сих пор
10
ответ дан 7 November 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: