【问题标题】:Lazy-programming in JavaJava中的惰性编程
【发布时间】:2015-12-11 14:59:43
【问题描述】:

我的问题很简单。我不明白以下并发编程练习。所以问题基本上是我必须在这里做什么:

public class Point {
 private final double x, y;
 private double distance; // Hinweis: sqrt (x*x+y*y);

 public Point(final double x, final double y) {
   this.x = x;
   this.y = y;
   this.distance = -1; // Lazy: Könnte u.U. nie benötigt werden
 }

 public double getX() {    return x;   }

 public double getY() {    return y;   }

 public double getDistance() {
...???
}

}

文字说:Lazy Evaluation - getDistance() 应该给出从点到其原点的距离。距离不应通过初始化设置,也不应在每次调用时反复计算(因为 x 和 y 距离是恒定的)。

他们是在要求我在这里使用 Futures 吗?

最好的问候。

【问题讨论】:

  • 他们要求您只计算一次距离,并且仅在需要时才计算距离。这里没有明显的并发任何东西。
  • 说真的,我不赞成,所以不是要求人们做你的学校/形成练习的地方......
  • 我不同意你们俩,并发在这里并不是完全不相关的,因为两个线程可以同时调用getDistance。而且它是针对学校/形成的事实并不会自动取消该问题的资格。
  • 如果这里的并发性确实是个问题,请“同步”get 函数。

标签: java lazy-evaluation concurrent-programming


【解决方案1】:

下面的代码只会计算一次距离。

您确定问题是关于并发的吗?如果有2个线程同时调用getDistance(),也许会计算两次,但这并不是真正的开销。但是,如果无论如何都必须只计算一次距离,那么您需要使用public synchronized double,更多信息here

private Double distance; // changed from double to Double so it's nullable

public double getDistance() {
    if (distance == null) {
        distance = <calculate distance here>
    }

    return distance;
}

【讨论】:

  • 您可能想更清楚地指出,您将distance 字段的类型更改为Double,以便您可以区分它之前是否已计算过。
猜你喜欢
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多