初始化时可以进行算术运算吗


public class Pot {
public String shape;
private int capacity;
public ArrayList<Flower> flowers = new ArrayList<Flower>();
public int free_space = capacity - flowers.size(); // why doesn't free_space work?
public Pot(String shape, int capacity) {
this.shape = shape;
this.capacity = capacity;
System.out.println(capacity); // test
System.out.println(flowers.size()); // test
System.out.println(free_space); //test
}

....
}

嗨,为什么我不能获得正确的自由空间?它总是0。我发现free_space = capacity - flowers.size()不起作用。

如果我们真的喜欢:


public static void main(String[] args) {
Pot p = new Pot("square", 8);
Flower f = new Flower(....);
.....
Flower f6 = new Flower(....);
p.insert(f);
.....
p.insert(f6);
}

应该是8点。

free_space取决于另外两个参数,当它被定义为free_space = capacity - flowers.size()时,并不意味着它将自动重新计算。

然而,这可以在getter的帮助下实现,getter返回计算结果(不需要单独的字段(:

public int getFreeSpace() {
return capacity - flowers.size();
}

同样值得重写方法toString以打印Pot类的快照并调用此getter:

@Override
public String toString() {
return String.format("Pot: {shape=%s, capacity=%d, flowers count=%d, free size=%d}", 
shape, capacity, flowers.size(), getFreeSpace());
}

测试:

Pot p = new Pot("square", 8);
System.out.println(p); // Pot: {shape=square, capacity=8, flowers count=0, free size=8}
p.insert(new Flower());
System.out.println(p); // Pot: {shape=square, capacity=8, flowers count=1, free size=7}
// etc

然而,从引入了lambdas和功能接口的Java8开始,可以用一个字段来代替计算getter,在这种情况下,该字段应该是Supplier<Integer>:

public Supplier<Integer> freeSpace = () -> capacity - flowers.size();

然后可以调用该供应商为:freeSpace.get(),并重新计算实际值。


在@darioscily注释后更新此外,IntSupplier可以与其方法getAsInt:一起使用

IntSupplier freeSpace = () -> capacity - flowers.size();
System.out.println(freeSpace.getAsInt());

您在初始化中进行计算。当然,它总是会返回0大小的

最新更新