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大小的