我可以在初始化时进行算术运算吗?
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
}
....
}
嗨,为什么我无法获得正确的 free_space?它总是 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 的帮助下实现(不需要单独的字段):
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
但是,从引入 lambda 和函数式接口的 Java 8 开始,可以用一个字段替换计算 getter,在这种情况下应该是Supplier<Integer>:
public Supplier<Integer> freeSpace = () -> capacity - flowers.size();
然后这个供应商可以被调用为:freeSpace.get()并重新计算实际值。
在@dariosicily 评论之后更新此外,IntSupplier可以与其方法一起使用getAsInt:
IntSupplier freeSpace = () -> capacity - flowers.size();
System.out.println(freeSpace.getAsInt());