3

我有这些课程:

我的问题是,对于每个类,我都必须手动注册节点。

/**
 * Contains the encoder for messages from the server.
 * 
 * @since 18/08/2018
 */
public abstract class MessageEncoder<T> {

    /**
     * Register this encoder to a message.
     */
    public abstract void register();

    /**
     * Get the encoded message to send to the client.
     * 
     * @param message The message.
     * @return the {@link GamePacket} ready to be sent.
     */
    public abstract GamePacket encode(T message);

}

其中 <T> 总是 someClass extends Message。

下面是消息编码器的样子:

public final class ComponentMessageEncoder extends MessageEncoder<ComponentTextMessage> {

    @Override 
    public void register() {
        GameConstants.RELEASE.register(ComponentTextMessage.class, this);

    }

    @Override 
    public GamePacket encode(ComponentTextMessage message) {
        // TODO Auto-generated method stub
        return null;
    }

}

正如您在 register 方法中看到的项目,我必须为我制作的每个编码器手动输入。

是否有一个捷径,我可以把它放在 MessageEncoder 抽象类中?

我在这里找不到任何有用的东西

编辑:

在哪里注册 sig。是:

/**
     * The encoders.
     */
    private final Map<Class<? extends Message>, MessageEncoder<?>> encoders = new HashMap<>();

    /**
     * Register a encoder to a message.
     * 
     * @param message The message.
     * @param encoder The encoder.
     */
    public void register(Class<? extends Message> message, MessageEncoder<?> encoder) {
        encoders.put(message, encoder);
    }
4

1 回答 1

2

您可以通过以下方式做得更好:

public abstract class MessageEncoder<T extends Message> {
    protected MessageEncoder(Class<? extends T> messageClass) {
      GameConstants.RELEASE.register(messageClass, this);
    }

    /**
     * Get the encoded message to send to the client.
     * 
     * @param message The message.
     * @return the {@link GamePacket} ready to be sent.
     */
    public abstract GamePacket encode(T message);
}

现在子类会做:

public final class ComponentMessageEncoder extends MessageEncoder<ComponentTextMessage> {
    ComponentMessageEncoder() {
      super(ComponentTextMessage.class);
    }

    // etc as before
}

这略微减少了重复,它允许编译器阻止你出错,所以这是一个胜利。

于 2018-08-21T21:58:58.140 回答