У меня есть библиотека, я должен динамически пометить класс определенным полем (генерация кода), и я не хочу, чтобы имена полей метаданных, которые я генерирую, конфликтовали с именами полей, определяемыми пользователем.
Используя 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];
}
}
@JoakimDanielson Я думаю, вы упустили тот факт, что этот вопрос касается генерации кода - пользователи могут определять любое количество полей.




В Java нет такого понятия символов, как в ES6.
Если вы просто хотите «пометить» класс, почему бы не подумать о том, чтобы он реализовал (возможно, пустой) интерфейс? Имена классов и интерфейсов уникальны.
Да, мне просто нужно уникальное имя, которое очень маловероятно или невозможно столкнуться с пользовательским / определяемым пользователем полем.
Что вы имеете в виду под полями метаданных и полями, определяемыми пользователем? Java - это не язык сценариев, и пользователи, кем бы они ни были в этом контексте, не могут просто определять поля. Помимо того, что у java есть область видимости, поле в одном классе не конфликтует с полем в другом классе, даже если у них такое же имя.