Получить статическое имя экземпляра в Java с помощью отражения во время конструирования - PullRequest
0 голосов
/ 18 июня 2019

Я не уверен, что это правильный способ уменьшить количество написанных символов, но все же.

Сейчас у меня есть следующий фрагмент кода, который отображается на два источника настроек: базу данных и файл .properties:

import lombok.*;

@Getter
@ToString
@EqualsAndHashCode
public final class Setting<T> {
    private String id;
    private Class<T> clazz;  

    private Setting(final String id, final Class<T> clazz) {
        this.id = id;
        this.clazz = clazz;
    }

    public static final Setting TOKEN_LENGTH = new Setting("TOKEN_LENGTH", Integer.class);
    // lots of other settings
}

Дело в том, что я хочу избежать явной передачи первого аргумента конструктору, например, как переменная с именем TOKEN_LENGTH имеет идентификатор TOKEN_LENGTH, переданный ей.Иначе, когда создаются эти static final переменные, их первым аргументом всегда является имя указанной переменной.

В этом случае создается только ~ 60 экземпляров этого класса, и это происходит только призапуск приложения, поэтому любые издержки, вызванные отражением, приемлемы.

Интересно, есть ли способ переписать конструктор, чтобы он выглядел примерно так:

    private Setting(final Class<T> clazz) {
        this.id = /* some crazy reflection magic */
        this.clazz = clazz;
    }

Итак, вопрос в следующем:

➥ Случайно, есть ли способ получить имя статической переменной, для которой объект создается и назначается?

UPD:

Существуетрешение, которое сначала создает все переменные, а затем последовательно устанавливает поле id.Я все еще ищу способ сделать это «атомарно» в конструкторе.

1 Ответ

1 голос
/ 18 июня 2019

Это относительно легко сделать, проблема в том, чтобы знать, какое поле использовать.Вы можете пометить его аннотацией, которая облегчит его.Что-то вроде

public String getFieldName(){
    Field[] fields = getClass().getDeclaredFields();
    for(Field f: fields){
        if(f.isAnnotationPresent(YourAnnotation.class)){
             return f.getName();
        }
    }
    // do whatever if a valid field wasn't found
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...