Доступ к закрытому внутреннему классу с помощью Lombok - PullRequest
0 голосов
/ 01 декабря 2019

Давайте возьмем следующий класс со статическим внутренним классом.

@Getter
@Setter
public class Request {
    private String contactUrl;
    private Resources resources;

    @Getter
    @Setter
    private static class Resources {
        private String basketId;
        private String customerId;
    }
}

Мне нужен доступ к basketId из другого класса, подобного этому:

Request request = new Request();
request.getResources.setBasketId("5");

Это не будеткомпилировать, если я не определю класс Resources как public.

Есть ли какой-либо другой способ использования Lombok доступа к этому полю при сохранении Resources private?

Ответы [ 2 ]

1 голос
/ 02 декабря 2019

Вы можете использовать @Delegate, чтобы эффективно «копировать» каждый метод, который у вас есть в закрытом внутреннем классе, во внешний (а реализация просто вызывает этот метод внутри):

@Delegate private Resources resources;

Обратите внимание, чтотип, используемый в сигнатуре (конструкторы, поля, методы и т. д. - некодовые аспекты типа), такой, что тип менее видим, чем сигнатура, действительно странно : здесь у вас естьОткрытый метод, который возвращает эффективно невидимый тип (ресурсы) для всего кода, который не находится в этом самом файле. Это плохая идея;никто не может использовать этот метод. Либо избавьтесь от метода получения и установки (например, используя вместо него Delegate), либо сделайте внутренний класс Resources общедоступным.

Давайте сделаем шаг назад: чего вы пытаетесь достичь? Например, если вы не хотите, чтобы кто-то использовал этот внутренний класс Resources без ведома внешнего, это легко выполнимо: просто создайте приватный конструктор в Resources и вуаля. Теперь никто не может создавать экземпляры, кроме вашего внешнего.

1 голос
/ 01 декабря 2019

Чтобы сохранить Resources частным, вы можете делегировать метод установки, например:

@Getter
@Setter
public class Request {
    private String contactUrl;
    private Resources resources;

    @Getter
    @Setter
    private static class Resources {
        private String basketId;
        private String customerId;
    }

    public setBasketId(String id) {
        resources.setBasketId(id)
    }
}

Или можете использовать отражение: Установить значение частного поля с отражением

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