账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于Java的方法的参数问题
    33
    0

    在一个Java类内定义了一个接口,然后将接口作为本类的一个方法的参数,当调用这个方法时,本应传入接口的位置传入了本类的另一个方法(这个方法和接口中的唯一方法的参数类型对应)。程序如下所示。我很不清楚这样使用的原理,接口和方法完全是两个东西,在调用的过程中发生了什么转换实现了这种方式?希望哪位大神指点一下,感谢。

    包含接口的类(其中定义了函数式接口、和参数为接口的方法、以及调用时传入的方法):

    public class ClientMessage {
        private static final Logger logger = LoggerFactory.getLogger(ClientMessage.class);
    
        public static HashMap<Integer, Transfer> tranferHandlerMap = new HashMap<>();
        public static HashMap<Class<?>, Integer> msg2ptoNum = new HashMap<>();
    
        @FunctionalInterface
        public interface Transfer{
            void process(Message msg, ClientConnection conn) throws IOException;
        }
    
        public static void registerTransferHandler(Integer ptoNum, Transfer tranfer, Class<?> cla) {
            if (tranferHandlerMap.get(ptoNum) == null)
                tranferHandlerMap.put(ptoNum, tranfer);
            else {
                logger.error("pto has been registered in transeerHandlerMap, ptoNum: {}", ptoNum);
                return;
            }
    
            if(msg2ptoNum.get(cla) == null)
                msg2ptoNum.put(cla, ptoNum);
            else {
                logger.error("pto has been registered in msg2ptoNum, ptoNum: {}", ptoNum);
                return;
            }
        }
    
        public static void processTransferHandler(Message msg, ClientConnection conn) throws IOException {
            logger.info("MessageName {}", msg.getClass());
            int ptoNum = msg2ptoNum.get(msg.getClass());
            Transfer transferHandler = tranferHandlerMap.get(ptoNum);
    
            if(transferHandler != null) {
                transferHandler.process(msg, conn);
            }
        }
    
        public static void transfer2Logic(Message msg, ClientConnection conn) {
            ByteBuf byteBuf = null;
            if(conn.getUserId() == null ) {
                logger.error("User not login.");
                return;
            }
    
            if(msg instanceof Chat.CPrivateChat) {
                byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Logic, conn.getUserId());
            }
    
            GateLogicConnectionHandler.getGatelogicConnection().writeAndFlush(byteBuf);
        }
    
        public static void transfer2Auth(Message msg, ClientConnection conn) {
            ByteBuf byteBuf = null;
            if(msg instanceof Auth.CLogin) {
                String userId = ((Auth.CLogin) msg).getUserid();
                byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Auth, userId);
                ClientConnectionMap.registerUserid(userId, conn.getNetId());
            } else if(msg instanceof Auth.CRegister) {
                byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Auth, ((Auth.CRegister) msg).getUserid());
            }
    
            GateAuthConnectionHandler.getGateAuthConnection().writeAndFlush(byteBuf);
    
        }
    }

    调用方法时的代码:

    ClientMessage.registerTransferHandler(1000, ClientMessage::transfer2Auth, Auth.CLogin.class);
    ClientMessage.registerTransferHandler(1001, ClientMessage::transfer2Auth, Auth.CRegister.class);
    ClientMessage.registerTransferHandler(1003, ClientMessage::transfer2Logic, Chat.CPrivateChat.class);
    ClientMessage.processTransferHandler(message, conn);
    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部