繁体   English   中英

是否有非静态字段的 Java 接口替代方案?

[英]Is there a Java interface alternative with non-static fields?

我正在设置一个事件系统,我希望我的所有事件都能扩展我创建的Event class。 但是,我还希望能够随时添加额外的setCanceledisCanceled方法。 这是一个例子:

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将无法同时扩展PlayerEventEventCancelable ,因为我不希望所有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM