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

2021-11-04 13:45:15 +08:00
 liuhouer

很多框架都有类似的接口

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();
			}
		});

644 次点击
所在节点    问与答
3 条回复
yazoox
2021-11-05 07:20:49 +08:00
为什么你认为“执行 invoke 前调用 open ,执行后调用 close”,如果发生了,直接在 open 那里打个断点,执行暂停后,看看 call stack 应该就知道了吧?
至少从你贴的代码来看,不会发生这样的事情。反正我没看出来,open, close, invoke 之间,有调用的关系。
zxCoder
2021-11-05 08:56:19 +08:00
应该还有你没看到的代码
liuhouer
2021-11-05 09:19:51 +08:00
是模板模式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/812994

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX