在ApplicationTest中创建Racing类时,我希望将FixNumberBehavior类交给参数。
如下图所示,传递参数以初始化FixNumberBehavior,但不能将类字段值传递给静态块。
错误消息如下所示。
Variable 'isMove' might not have been initialized
FixNumberBehavior.java
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
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
@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)
);
}如何在静态块中初始化对象?
发布于 2022-01-30 07:04:24
问题是FixNumberBehavior有一个final字段,必须在构造函数中设置,或者在字段定义行的赋值中设置。
虽然存在一个为该字段取值的构造函数,但是静态块并不使用该构造函数,而是使用了一个no-arg构造函数。
在isMove语句中传递最后一个字段( new )的值。
发布于 2022-01-30 10:55:04
我不知道你为什么想让事情复杂化
当您已经拥有构造函数时,false.
FixNumberBehavior实例是否将isMove设置为true,或者将isMove (in your answer) isMove设置为isMove,从FixNumberBehavior设置为static。这两个关键字有不同的用途:final防止向itstatic重新分配新值,从而使该字段成为类字段,而不是实例字段,因此即使您创建了两个FixNumberBehavior实例,它们也将只使用一个isMove变量(因此不能在一个实例状态(如isMove=true )和另一个状态isMove=false).中保留)。
你要找的可能只是
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;
}
}发布于 2022-01-30 07:28:14
我通过把静电附着在磁场上来解决这个问题。
编译时不标识在静态块中创建的对象。因此,要传递给在静态块中创建的对象的参数值也必须进行统计处理。
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;
}
}https://stackoverflow.com/questions/70912511
复制相似问题