public class OnClickListenerManger {
public interface ClickListener{
void onClick();
}
private HashSet<ClickListener> clickListeners = new HashSet<>();
public void addClickListener(ClickListener clickListener){
clickListeners.add(clickListener);
}
public void removeClickListener(ClickListener clickListener){
clickListeners.remove(clickListener);
}
public int getClickListenerCount(){
return clickListeners.size();
}
}
//注意:只有java代码的接口,kotlin才能进行转换,并且该接口只能有一个方法
fun main(args: Array<String>) {
var onClickListenerManger = OnClickListenerManger()
var lamda = {
print(123)
}
onClickListenerManger.addClickListener(lamda)
onClickListenerManger.removeClickListener(lamda)
println("ClickListener的个数为:${onClickListenerManger.clickListenerCount}")
}
运行结果:
为什么删除不掉HashSet里面的数据呢?因为上面的写法相当于以下代码:
onClickListenerManger.addClickListener(object : OnClickListenerManger.ClickListener{
override fun onClick() {
lamda()
}
})
onClickListenerManger.removeClickListener(object :OnClickListenerManger.ClickListener{
override fun onClick() {
lamda()
}
})
正确写法1:
fun main(args: Array<String>) {
var onClickListenerManger = OnClickListenerManger()
//确定lamda的类型为OnClickListenerManger.ClickListener
var lamda = OnClickListenerManger.ClickListener{
print(123)
}
onClickListenerManger.addClickListener(lamda)
onClickListenerManger.removeClickListener(lamda)
println("ClickListener的个数为:${onClickListenerManger.clickListenerCount}")
}
正确写法2:
fun main(args: Array<String>) {
var onClickListenerManger = OnClickListenerManger()
//明确lamda为匿名内部类
var lamda = object :OnClickListenerManger.ClickListener{
override fun onClick() {
print(123)
}
}
onClickListenerManger.addClickListener(lamda)
onClickListenerManger.removeClickListener(lamda)
println("ClickListener的个数为:${onClickListenerManger.clickListenerCount}")
}
两种写法的运行结果是一样的: