Добавить поле "символ" в класс Java

У меня есть библиотека, я должен динамически пометить класс определенным полем (генерация кода), и я не хочу, чтобы имена полей метаданных, которые я генерирую, конфликтовали с именами полей, определяемыми пользователем.

Используя JavaScript, мы можем использовать для этого Символы ES6. Мы можем создавать геттеры / сеттеры и извлекать поля, используя символы, и таким образом предотвращать конфликты имен.

Итак, используя JS, это может выглядеть так:

export class Foo {

  static libraryDefinedField = Symbol('lib.defined')

  userDefinedField = 'whatev';

  setLibraryDefinedField(v){
    this[Foo.libraryDefinedField] = v;
  }

  getLibraryDefinedField(v){
    return this[Foo.libraryDefinedField];
  }

} 

есть ли способ как-то сделать это с помощью Java - создать поля экземпляр или статический в классе, которые не будут конфликтовать с пользовательскими полями?

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

// put the symbol outside the class, so even static properties won't conflict
const libraryDefinedField = Symbol('lib.defined');

export class Foo {

  userDefinedField = 'whatev';

  setLibraryDefinedField(v){
    this[libraryDefinedField] = v;
  }

  getLibraryDefinedField(v){
    return this[libraryDefinedField];
  }

} 

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

Joakim Danielson 01.12.2018 09:56

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

Sami Hult 01.12.2018 09:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
132
1

Ответы 1

В Java нет такого понятия символов, как в ES6.

Если вы просто хотите «пометить» класс, почему бы не подумать о том, чтобы он реализовал (возможно, пустой) интерфейс? Имена классов и интерфейсов уникальны.

Да, мне просто нужно уникальное имя, которое очень маловероятно или невозможно столкнуться с пользовательским / определяемым пользователем полем.

Alexander Mills 01.12.2018 10:27

Другие вопросы по теме