Разобрался! Вот что работает как в производстве , так и в симуляторе:)
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;
}
Нет, перечисления, как предполагается, являются полным статическим перечислением.
Во время компиляции, Вы могли бы хотеть генерировать свое перечисление .java файл от другого какого-то исходного файла. Вы могли даже создать .class файл как это.
В некоторых случаях Вы могли бы хотеть ряд стандартных значений, но позволить расширение. Обычный способ сделать это, имеют interface
для интерфейса и enum
, который реализует это interface
для стандартных значений. Конечно, Вы теряете способность к switch
, когда у Вас только есть ссылка на interface
.
Позади занавеса перечисления являются POJOs с частным конструктором и набором общедоступных статических окончательных значений типа перечисления (см. здесь для примера). На самом деле, вплоть до Java5, это считали лучшей практикой для создания собственного перечисления этот путь, и Java5 представил enum
ключевое слово как стенография. Посмотрите источник для Enum< T> для узнавания больше.
, Таким образом, это не должна быть без проблем для записи собственного 'TypeSafeEnum' с общедоступным статическим заключительным массивом констант, которые читаются конструктором или передаются ему.
кроме того, сделайте себе одолжение и переопределите equals
, hashCode
и toString
, и, если возможно создайте values
метод
, вопрос состоит в том, как использовать такое динамическое перечисление... Вы не можете считать значение "PI=3.14" из файла, чтобы создать enum MathConstants
и затем идти вперед и использовать MathConstants.PI
везде, где Вы хотите...
Я столкнулся с этой проблемой на формирующий проект моей молодой карьеры .
подход, который я проявил, должен был сохранить значения и названия перечисления внешне, и конечная цель должна была смочь написать код, который смотрел максимально близко к перечислению языка.
я хотел свое решение быть похожим на это:
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 под нехваткой времени не меньше.
Можно загрузить класс Java из источника во времени выполнения. (Используя JCI, BeanShell или JavaCompiler)
Это позволило бы Вам изменять Перечислимые значения, как Вы желаете.
Примечание: это не изменило бы классов, которые упомянули эти перечисления, таким образом, это не могло бы быть очень полезно в действительности.
Вы могли попытаться присвоить свойства ПЕРЕЧИСЛЕНИЮ, Вы пытаетесь создать и статически создать его при помощи загруженного файла свойств. Большой взлом, но это работает :)
Мне нужно было сделать что-то подобное (для целей модульного тестирования), и я наткнулся на это - EnumBuster: http://www.javaspecialists.eu/archive/Issue161.html
Это позволяет добавлять, удалять и восстанавливать значения перечисления.
Правка : Я только начал использовать это и обнаружил, что для java 1.5 требуются некоторые небольшие изменения, с которыми я сейчас застрял: