Java 8 为可选设置默认值的更好方法是什么

Java 8 为可选设置默认值的更好方法是什么,java-8,optional,Java 8,Optional,我有一个有这么多选项的模型对象。该模型对象用于整个事务。 在事务开始时,我需要在可选字段中输入默认值 所以 第一种方法是在一个具有非可选值的对象中进行转换,但我将毫无理由地拥有一个冗余类。第二种方法是我在下面所做的,但是有没有更好的方法来编写updateDefaults方法 class SampleRequest{ Optional<String> a; Optional<String> b; Optional<String> c; Optional&

我有一个有这么多选项的模型对象。该模型对象用于整个事务。 在事务开始时,我需要在可选字段中输入默认值

所以 第一种方法是在一个具有非可选值的对象中进行转换,但我将毫无理由地拥有一个冗余类。第二种方法是我在下面所做的,但是有没有更好的方法来编写
updateDefaults
方法

class SampleRequest{
 Optional<String> a;
 Optional<String> b;
 Optional<String> c;
 Optional<String> d;
}


public void doSomething(SampleRequest sampleRequest){
 updateDefaults(sampleRequest)
 call other services    ...
}

void updateDefaults(SampleRequest sampleRequest){
 String aa= sampleRequest.getA().orElse("A"); // Application specific complex logic. values has to be set  
     sampleRequest.setA(Optional.of(aa));
    
    and so one....
}
类采样器请求{
任择a;
可选b;
任选c;
任选d;
}
公共空隙剂量测定(采样器测定采样器测定){
UpdatedFaults(sampleRequest)
呼叫其他服务。。。
}
无效更新故障(SampleRequest SampleRequest){
字符串aa=sampleRequest.getA().orElse(“A”);//特定于应用程序的复杂逻辑。必须设置值
取样器要求刚毛(可选的(aa));
还有一个。。。。
}

编写updateDefaults方法的更好方法是什么?

我可能会使用装饰器

interface Request {
    Optional<String> getA();
}

class SampleRequest implements Request {
    private final String a;

    public Optional<String> getA() {
        return Optional.ofNullable(a);
    }
}

// Decorator
class DefaultingRequest implements Request {
    private final Request delegate;

    public Optional<String> getA() {
        return Optional.of(
            delegate.getA().orElse(DEFAULT_A)
        );
    }
}

您也可以引入一个新接口。这样做的缺点是,您不能将
请求
FilledRequest
一样处理。好处是您知道是否已经应用了默认值。使用上述方法,您可以不必要地多次包装相同的内容

interface Request {
    Optional<String> getA();

    FilledRequest toFilledRequest();
}

class SampleRequest implements Request {
    //...

    public FilledRequest toFilledRequest() {
        return new FilledSampleRequest(this);
    }
}

interface FilledRequest { // the same as Request, but not Optional
    String getA();
}

class FilledSampleRequest {
    private final SampleRequest sampleRequest;

    public String getA() {
        return sampleRequest.orElse(DEFAULT_A);
    }
}
接口请求{
可选的getA();
FilledRequest to FilledRequest();
}
类SampleRequest实现请求{
//...
公共填写填写的要求填写申请表(){
返回新填写的SampledRequest(本);
}
}
接口FilledRequest{//与请求相同,但不是可选的
字符串getA();
}
类filledSamplerRequest{
私人最终采样器测试;
公共字符串getA(){
返回sampleRequest.orElse(默认值);
}
}

如果您有变量的默认值,那么
可选
的用途是什么。。。我把它们拿走了。。。之前我有期权,交易中的每个后续服务都以自己的方式处理期权。。。但是现在我们有了一个通用的规则引擎,可以在开始时设置默认值,所以删除可选的并重构底层事务代码是有意义的。我很懒,刚开始就开始工作。
interface Request {
    Optional<String> getA();

    FilledRequest toFilledRequest();
}

class SampleRequest implements Request {
    //...

    public FilledRequest toFilledRequest() {
        return new FilledSampleRequest(this);
    }
}

interface FilledRequest { // the same as Request, but not Optional
    String getA();
}

class FilledSampleRequest {
    private final SampleRequest sampleRequest;

    public String getA() {
        return sampleRequest.orElse(DEFAULT_A);
    }
}