1

是否可以在 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()

4

1 回答 1

3

您不能隐藏或更改记录字段自动生成的读取访问器的返回类型。

实现您正在寻找的一种方法是让记录实现一个接口,然后使用它而不是记录类型:

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)支持将数据建模为 data。换句话说,他们的用例是当您拥有要存储的直接不可变数据并让用户直接访问时。这就是他们不支持更改访问器的原因:这不是记录的用途。我在上面展示的模式(即实现隐藏访问接口的记录)是一种隐藏使用记录作为实现细节并控制对字段的访问的方法。

于 2020-11-03T23:22:47.910 回答