java - 我可以在初始化中进行算术运算吗?
问题描述
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
但是,从引入 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());
推荐阅读
- makefile - Make:避免在多个 Makefile 中具有相同目标的问题
- sql - 使用日期和时间部分获取最新记录,聚合函数出错
- python - Python 日志记录:使用文件模式“w”时覆盖而不是附加
- flutter - AnimatedContainer 不适用于 ListView
- django - 无法使用带有 csrf 令牌的改造从 android 成功调用
- laravel - 验证与复选框相关的时间是否被选中?
- google-cloud-ml - 如何使 AI Platform 部署的模型可公开访问?
- android - Unity 控制台提示安装成功,但在移动设备上找不到游戏
- python - 如何使用 Python 获取 Selenium Chromedriver 的 ID?
- python - 如何通过包含特定python版本的docker从linux运行python代码