V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
liuhouer
V2EX  ›  问与答

接口的设计怎么保证的执行顺序呢?请大佬来解惑!

  •  
  •   liuhouer · 2021-11-04 13:45:15 +08:00 · 635 次点击
    这是一个创建于 876 天前的主题,其中的信息可能已经有所发展或是发生改变。

    很多框架都有类似的接口

    1.接口 1

    public interface RichFunction{
    
     void open(Configuration parameters) throws Exception;
     
     void close() throws Exception;
    
    }
    

    2.抽象类

    public abstract class AbstractRichFunction implements RichFunction{
        @Override
    	public void open(Configuration parameters) throws Exception {}
    
    	@Override
    	public void close() throws Exception {}
    }
    

    3.接口 2

    public interface SinkFunction<IN>{
        default void invoke(IN value, SinkFunction.Context context) throws Exception {
            this.invoke(value);
        }
    }
    

    4.定义抽象类 2

    public abstract class RichSinkFunction<IN> extends AbstractRichFunction implements     SinkFunction<IN> {
        private static final long serialVersionUID = 1L;
    
        public RichSinkFunction() {
        }
    }
    

    引用抽象类 2 的时候,如果重写了 open 和 close 方法,那么执行 invoke 方法前会先调用 open ,执行结束后执行 close ,请问下这是怎么做到的呢?

    new RichSinkFunction<Tuple2<String, Integer>>() {
    
    
    			private static final long serialVersionUID = -6063998106426201742L;
    
    			private transient SqlSession sqlSession;
    
    			@Override
    			public void open(Configuration parameters) throws Exception {
    				super.open(parameters);
    				sqlSession = MybatisSessionFactory.getSqlSessionFactory().openSession();
    			}
    
    			@Override
                public void invoke(Tuple2<String, Integer>  value) throws Exception{
    
                    try{
                    	//do something
                        sqlSession.commit();
                    }
                    catch (Throwable e){
                        sqlSession.rollback();
    					e.printStackTrace();
                    }
                }
    
    			@Override
    			public void close() throws Exception {
    				sqlSession.close();
    				super.close();
    			}
    		});
    
    
    3 条回复    2021-11-05 09:19:51 +08:00
    yazoox
        1
    yazoox  
       2021-11-05 07:20:49 +08:00
    为什么你认为“执行 invoke 前调用 open ,执行后调用 close”,如果发生了,直接在 open 那里打个断点,执行暂停后,看看 call stack 应该就知道了吧?
    至少从你贴的代码来看,不会发生这样的事情。反正我没看出来,open, close, invoke 之间,有调用的关系。
    zxCoder
        2
    zxCoder  
       2021-11-05 08:56:19 +08:00
    应该还有你没看到的代码
    liuhouer
        3
    liuhouer  
    OP
       2021-11-05 09:19:51 +08:00
    是模板模式
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2849 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:42 · PVG 19:42 · LAX 04:42 · JFK 07:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.