首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在静态块中创建对象时如何初始化值

在静态块中创建对象时如何初始化值
EN

Stack Overflow用户
提问于 2022-01-30 06:54:03
回答 3查看 89关注 0票数 0

在ApplicationTest中创建Racing类时,我希望将FixNumberBehavior类交给参数。

如下图所示,传递参数以初始化FixNumberBehavior,但不能将类字段值传递给静态块。

错误消息如下所示。

Variable 'isMove' might not have been initialized

FixNumberBehavior.java

代码语言:javascript
复制
public class FixNumberBehavior implements CarMoveBehavior {

  private final boolean isMove;
  private static FixNumberBehavior fixNumberBehavior;

  static {
      fixNumberBehavior = new FixNumberBehavior(); //error
  }

  public FixNumberBehavior(final boolean isMove) {
      this.isMove = isMove;
  }

  @Override
  public boolean moveBehavior() {
     return isMove;
  }
}

Racing.java

代码语言:javascript
复制
public class Racing {

private List<Car> cars;
private CarMoveBehavior carMoveBehavior;

public Racing(List<Car> cars, final CarMoveBehavior carMoveBehavior) {
    this.cars = cars;
    this.carMoveBehavior = carMoveBehavior;
}

public List<Car> getCars() {
    return cars;
}

public void drive() {
    cars.stream()
        .forEach(car -> racingCondition(car));
}

private void racingCondition(Car car) {
    if (carMoveBehavior.moveBehavior()) {
        car.moveForward();
     }
  }
}

ApplicationTest

代码语言:javascript
复制
 @ParameterizedTest
    @CsvSource({"a,aa,aaa"})
    void fixRandomNumberTest(String one, String two, String three) {
        final List<Car> cars = Arrays.asList(new Car(one), new Car(two), new Car(three));
        Racing racing = new Racing(cars, new FixNumberBehavior(true));
        racing.drive();
        racing.drive();
        assertAll(
            () -> assertThat(cars.get(0).getStep()).isEqualTo(2),
            () -> assertThat(cars.get(1).getStep()).isEqualTo(2),
            () -> assertThat(cars.get(2).getStep()).isEqualTo(2)
        );
    }

如何在静态块中初始化对象?

EN

回答 3

Stack Overflow用户

发布于 2022-01-30 07:04:24

问题是FixNumberBehavior有一个final字段,必须在构造函数中设置,或者在字段定义行的赋值中设置。

虽然存在一个为该字段取值的构造函数,但是静态块并不使用该构造函数,而是使用了一个no-arg构造函数。

isMove语句中传递最后一个字段( new )的值。

票数 1
EN

Stack Overflow用户

发布于 2022-01-30 10:55:04

我不知道你为什么想让事情复杂化

当您已经拥有构造函数时,false.

  • changing

  • 提供了非参数构造函数,在构造函数中,您可以让客户端决定创建的FixNumberBehavior实例是否将isMove设置为true,或者将isMove (in your answer) isMove设置为isMove,从FixNumberBehavior设置为static。这两个关键字有不同的用途:
  • final防止向it
  • static重新分配新值,从而使该字段成为类字段,而不是实例字段,因此即使您创建了两个FixNumberBehavior实例,它们也将只使用一个isMove变量(因此不能在一个实例状态(如isMove=true )和另一个状态isMove=false).

中保留)。

你要找的可能只是

代码语言:javascript
复制
public class FixNumberBehavior implements CarMoveBehavior {

    private final boolean isMove;

    private static FixNumberBehavior fixNumberBehavior = new FixNumberBehavior(true);
                                                     //set value you want here ^^^^

    public FixNumberBehavior(final boolean isMove) {
        this.isMove = isMove;
    }

    @Override
    public boolean moveBehavior() {
        return isMove;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2022-01-30 07:28:14

我通过把静电附着在磁场上来解决这个问题。

编译时不标识在静态块中创建的对象。因此,要传递给在静态块中创建的对象的参数值也必须进行统计处理。

代码语言:javascript
复制
package racingcar.model.domain;

public class FixNumberBehavior implements CarMoveBehavior {

    private static boolean isMove;
    private static FixNumberBehavior fixNumberBehavior;

    static {
        fixNumberBehavior = new FixNumberBehavior(isMove);
    }

    private FixNumberBehavior() {

    }

    public static FixNumberBehavior getInstance(){
        return fixNumberBehavior;
    }

    public FixNumberBehavior(final boolean isMove) {
        this.isMove = isMove;
    }

    @Override
    public boolean moveBehavior() {
        return isMove;
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70912511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档