Java 返回构建器的实现

问题描述 投票:0回答:1

我为一个类制作了一个功能构建器,其工作方式如下

new ComponentStatus.Builder()
        .with($ -> {
          $.name = element.getName();
          $.state = element.getState();
          $.status = element.getStatus();
          $.description = element.getStatusDescription();
        }).build();

班级是

public class ComponentStatus {

  private final String name;
  private final int state;
  private final int status;
  private final String description;

  ComponentStatus(String name, int state, int status, String description) {
    this.name = name;
    this.state = state;
    this.status = status;
    this.description = description;
  }

  public static class Builder {

    public String name;
    public int state;
    public int status;
    public String description;

    Builder with(
        Consumer<Builder> builderFunction) {
      builderFunction.accept(this);
      return this;
    }

    ComponentStatus build() {
      return new ComponentStatus(name, state, status, description);
    }

  }
}

它有效。现在我想向其他类添加一个构建器。

with()
方法总是相同的,所以我尝试制作一个界面来保存样板

public interface Buildable {

  default Buildable with(
      Consumer<Buildable> builderFunction) {
    builderFunction.accept(this);
    return this;
  }

    Object build();
}

这不起作用,因为

with()
返回
Buildable
而不是
<? extends Buildable>
,但更改返回类型也不起作用。该怎么办?

java generics builder
1个回答
0
投票

要解决这个问题,您可以使用带有自引用类型参数的泛型。

以下是定义

Buildable
界面的方法:

import java.util.function.Consumer;

public interface Buildable<T extends Buildable<T>> {

    default T with(Consumer<T> builderFunction) {
        builderFunction.accept((T) this);
        return (T) this;
    }

    Object build();
}

现在更新您的

ComponentStatus.Builder
类以实现
Buildable
:

public static class Builder implements Buildable<Builder> {

    public String name;
    public int state;
    public int status;
    public String description;

    @Override
    public ComponentStatus build() {
        return new ComponentStatus(name, state, status, description);
    }
}

这样,

with
方法将返回正确的构建器类型,从而允许方法链接。

© www.soinside.com 2019 - 2024. All rights reserved.