背景
我将以下界面作为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表达式,而强制客户端将其实现为匿名类。当然,为它添加一个虚拟方法可以解决问题,但在我看来,这将是任意和不整洁的。还有另一种方式吗?
答案 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是一种奇怪的方法。