首页 > 解决方案 > 我可以在初始化中进行算术运算吗?

问题描述

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

标签: javaarraylist

解决方案


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

但是,从引入 lambdas 和函数式接口的 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());

推荐阅读