[英]Is there a Java interface alternative with non-static fields?
我正在设置一个事件系统,我希望我的所有事件都能扩展我创建的Event
class。 但是,我还希望能够随时添加额外的setCanceled
和isCanceled
方法。 这是一个例子:
public class Event {}
public interface EventCancelable {
public default void setCanceled(boolean canceled) {...}
public default boolean isCanceled() {...}
}
public class PlayerEvent extends Event {
public Player player;
public PlayerEvent(Player player) {
this.player = player;
}
}
public class PlayerMovementEvent extends PlayerEvent implements EventCancelable {...}
如您所见,我使用了一个接口来添加稍后的方法。 问题是如果事件被取消我必须如何存储:
public interface EventCancelable {
Map<Object, Boolean> canceled = new HashMap<>();
public void setCanceled(boolean canceled) {
canceled.put(this, canceled);
}
public boolean isCanceled() {
return canceled.get(this);
}
}
注意,由于 Java 只允许 static 字段,我必须创建一个 map 来存储哪些事件被取消。 这工作正常,但过了一会儿,考虑到事件被非常频繁地调用,这将占用越来越多的 memory。 有没有一种方法可以在不使用界面的情况下添加可取消的功能,并且无需手动将代码放入我希望能够取消的每个事件中? 我不能使用EventCancelable
class,因为那时PlayerMovementEvent
将无法同时扩展PlayerEvent
和EventCancelable
,因为我不希望所有PlayerEvent
都是可取消的。
或者 Java 是否足够聪明以清空 map 不再使用的额外事件,因为 map 仅在接口中使用,并将this
添加为参数?
您可以尝试使用WeakHashMap
, 在此处查找扩展示例。
但是,您应该知道有一些注意事项:
当死条目将从Map
中删除时,您的控制或知识为零
这给GC
带来了额外的压力,因为它需要为这些类型的引用做额外的工作( WeakHashMap
下的WeakReference
)
默认方法不应该那样使用。 他们应该提供方法的实现,这些方法可以使用接口的其他公共方法实现合理的默认值。
尝试编写类:
interface Cancellable {
void cancel();
boolean isCancelled();
}
class CancellableImpl implements Cancellable {
private boolean cancelled;
...
}
class PlayerMovementEvent extends PlayerEvent implements Cancellable {
private CancellableImpl cancellable = new Cancellable();
public cancel() { cancellable.cancel(); }
public isCancelled() { return cancellable.isCancelled(); }
...
}
只有几行额外的代码,但它使事情更容易理解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.