我有这些课程:
我的问题是,对于每个类,我都必须手动注册节点。
/**
* 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);
}