Java 15 - записи с другим типом возврата для геттера

Можно ли реализовать что-то подобное в java 15?

record Something(
        SomeId id,
        MyProp myProp,
        MaybeProp maybeProp
){
    public Something(SomeId id, MyProp myProp){
        this(id, myProp, null);
    }

    public Optional<MaybeProp> maybeProp(){ //problematic line
        return Optional.ofNullable(maybeProp);
    }
}

Здесь я получаю исключение

(return type of accessor method maybeProp() must match the type of record component maybeProp)

Итак - я понимаю, в чем проблема; Но есть ли другое решение для этого? Как иметь дополнительный член внутри записи, который мне не нужно инициализировать с помощью Optional.of()?

1 ответ

Решение

Вы не можете скрыть или изменить тип возвращаемого значения автоматически созданного средства доступа для чтения для поля записи.

Один из способов добиться того, что вы ищете, - реализовать в записи интерфейс, а затем использовать его вместо типа записи:

interface PossibleSomething {
    Optional<Something> maybeSomething();
}

record SomethingRecord(Something something) implements PossibleSomething {
    public Optional<Something> maybeSomething() {
        return Optional.ofNullable(something);
    }
}

// user code:
PossibleSomething mySomething = new SomethingRecord(something);
mySomething.maybeSomething().ifPresent(...)

Используя PossibleSomething в вызывающем коде вы явно заявляете, что вам не нужен прямой доступ к полю, но вы получите доступ к нему только через средство доступа интерфейса.

С точки зрения философии проектирования, записи явно предназначены (согласно JEP) для поддержки данных моделирования как данных. Другими словами, их вариант использования - это когда у вас есть прямые неизменяемые данные, которые вы хотите сохранить и предоставить пользователю прямой доступ. Вот почему они не поддерживают изменение средств доступа: записи не для этого. Показанный выше шаблон (т.е. запись, реализующая интерфейс для скрытия доступа) - это способ скрыть использование записи в качестве детали реализации и контролировать доступ к полям.

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