接口可以以某种方式阻止lambda表达式实现吗?

时间:2015-08-18 08:27:44

标签: java lambda

背景

我将以下界面作为API的一部分公开:

public interface Pasture {
    /**
     * @param t         The time of the visit (as measured from optimization starting point).
     * @param tLast     The time of the preceding visit (as measured from optimization starting point).
     * @return          The expected reward that will be reaped by visiting under the given conditions.
     */
    double yield(long t, long tLast);    
}

客户通过我"牧场的模型"作为实现此接口的对象。每个物体代表一个牧场。

在我的API方面,我会跟踪"访问"在不同时间对这些物体进行调用,然后在我需要知道牧场在平均时间内产生多少时调用pasture.yield(time, lastVisitTime)

问题出现了,这个接口可以在客户端实现为lambda表达式,apparently each lambda expression instantiation does not necessarily create a new object with a new identity,这是我依赖的,以便跟踪在什么时间访问过哪些牧场。

问题

是否有办法阻止将接口实现为lambda表达式,而强制客户端将其实现为匿名类。当然,为它添加一个虚拟方法可以解决问题,但在我看来,这将是任意和不整洁的。还有另一种方式吗?

2 个答案:

答案 0 :(得分:5)

这不是lambda边缘情况,这是你的问题。

您正在做假设,即相同的对象代表相同的Pasture,因此您的对象会同时执行两项操作。这是代码气味,是造成困难的原因。

您应该强制Pasture个对象实现equals之类的内容,以便您可以检查项目是否相同。遗憾的是,没有interface这样做,最近的是Comparable

public interface Pasture extends Comparable<Pasture> {

答案 1 :(得分:1)

您可以向方法添加一些已检查的异常:

public interface Pasture {
   double yield(long t, long tLast) throws Exception;    
}

但是拒绝lambda是一种奇怪的方法。