Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java15-getter返回类型不同的记录_Java_Java Record_Java 15 - Fatal编程技术网

Java15-getter返回类型不同的记录

Java15-getter返回类型不同的记录,java,java-record,java-15,Java,Java Record,Java 15,可以在Java15中实现类似的东西吗 record Something( SomeId id, MyProp myProp, MaybeProp maybeProp ){ public Something(SomeId id, MyProp myProp){ this(id, myProp, null); } public Optional<MaybeProp> maybeProp(){ //p

可以在Java15中实现类似的东西吗

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);
    }
}
记录某事(
某某,
MyProp MyProp,
MaybeProp MaybeProp
){
公共某物(SomeId id,MyProp MyProp){
这个(id,myProp,null);
}
公共可选的maybeProp(){//有问题的行
返回可选。不可用(可能是不可用的);
}
}
这里有个例外

(访问器方法maybeProp()的返回类型必须与记录组件maybeProp的类型匹配)


所以-我明白问题是什么;但是,还有其他解决办法吗?如何在记录中包含可选成员,我不需要使用
optional.of()
初始化该成员?

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

实现所需功能的一种方法是让记录实现一个接口,然后使用该接口而不是记录类型:

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(...)
接口可能方法{
可选的maybeSomething();
}
记录某事记录(某事)实现可能的方法{
公共可选的maybeSomething(){
返回可选。不可用的(某物);
}
}
//用户代码:
可能的方法我的东西=新的东西记录(东西);
mySomething.maybeSomething().ifPresent(…)
通过在调用代码中使用
PossibleSomething
,您明确声明不需要直接访问该字段,但只能通过接口的访问器访问该字段


作为一种设计理念,记录明确旨在(根据)支持建模数据作为数据。换句话说,它们的用例是当您有直接的不可变数据要存储并允许用户直接访问时。这就是为什么他们不支持更改访问器:这不是记录的用途。我在上面展示的模式(即实现接口以隐藏访问的记录)是一种隐藏将记录用作实现细节并控制对字段访问的方法。

只是为了澄清-您希望记录字段作为参考,使用
null
表示“不存在”,但当用户请求值时,是否希望将其作为
可选项返回?如果这是您的问题,那么答案是不可能隐藏或更改每个字段自动生成的读取访问器的返回类型。您需要一个具有不同名称的附加访问器,该访问器使用nullable的
准确地返回
可选的
。那会管用的,只是有点难看。我想我还必须以某种方式禁用该
maybeProp
,这样它就不会被调用。我将添加一个不同的建议作为答案。将maybeProp的类型更改为可选,并在构造函数中而不是在getter中进行包装怎么样?记录的基本折衷是:您已经放弃了解耦API的能力由你方代表;构造和访问的API直接来自状态描述。因此,不是。如果组件的类型是
T
,那么其相应的访问器和规范构造函数参数的类型也将是
T
。(但是你可以有额外的构造器。)谢谢。我可以随时使用这个类。我只是想知道record是否是一个选项。OP发布的另一个问题,即试图隐藏实际的访问者,在这种模式下仍然存在。@Naman不确定这是什么意思。因为引用被分配给接口类型的变量,所以没有访问数据的方法。@sprinter我猜他是说,如果你像
SomethingRecord mySomething
(你可以)那样使用它,你仍然会有
mySomething.something()
accessor.@BojanVukasovic在我回答的第一句话中提到,不可能隐藏记录的公共访问器。