我有这些类(class):
我的问题是对于每个类我都必须手动注册节点。
/**
* 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);
}
这是消息编码器的样子:
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;
}
}
正如您在注册方法中看到的项目,我必须为我制作的每个编码器手动输入。
是否有一个快捷方式,我可以将其放入 MessageEncoder 抽象类中?
我在这里找不到任何有用的东西
编辑:
在哪里注册签名。是:
/**
* 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);
}
最佳答案
你可以做得更好:
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
}
这稍微减少了重复,并且它允许编译器阻止您出错,所以这是一个胜利。
关于Java 泛型类型利用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51957127/