我有这些课程:我的问题是,对于每个类,我都必须手动注册节点。/** * 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 扩展消息。这是消息编码器的样子: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 抽象类的快捷方式?我在这里找不到任何有用的东西
1 回答
largeQ
TA贡献2039条经验 获得超7个赞
您可以通过以下方式做得更好:
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
}
这稍微减少了重复,它允许编译器阻止你出错,所以这是一个胜利。
添加回答
举报
0/150
提交
取消