差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
java:java8:functionalinterface:method_reference [2017/02/24 14:31] tony [How to resolve?] |
java:java8:functionalinterface:method_reference [2023/06/25 09:48] (目前版本) |
||
---|---|---|---|
行 46: | 行 46: | ||
問題是: 如果我有10個bus相關操作,不就要寫很多一樣的code嗎? | 問題是: 如果我有10個bus相關操作,不就要寫很多一樣的code嗎? | ||
===== How to resolve? ===== | ===== How to resolve? ===== | ||
- | 一開始我就想,除了aop、intercepter等方式外,function pointer應該就能解決我的問題: 只要有一個method會在critical action前後做lock與release就可以了。最後使用了Java8的FunctionalInterface,宣告以下介面: | + | 一開始我就想,除了aop、intercepter等方式外,function pointer應該就能解決我的問題: 只要有一個method會在critical action前後做lock與release就可以了。類似以下: |
+ | <code java> | ||
+ | void busAction(Function* criticalAction){ | ||
+ | lockAndWait(); | ||
+ | |||
+ | criticalAction->invoke(); | ||
+ | |||
+ | release(); | ||
+ | } | ||
+ | </code> | ||
+ | 最後宣告一個名為BusAction的FunctionalInterface: | ||
<code java> | <code java> | ||
@FunctionalInterface | @FunctionalInterface | ||
- | private interface BusAction { | + | public interface BusAction { |
boolean invoke(); | boolean invoke(); | ||
} | } | ||
行 84: | 行 94: | ||
</code> | </code> | ||
透過以上方法,可以讓我大幅減少duplicated code。 | 透過以上方法,可以讓我大幅減少duplicated code。 | ||
+ | ===== 後記 ===== | ||
+ | 如果不想額外增加Interface,也可以直接使用Runable或Callable,取決於你是否要讓語義更清楚而已。 | ||
===== Reference ===== | ===== Reference ===== | ||
* [[https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html|Oracle Java - Method Reference]] | * [[https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html|Oracle Java - Method Reference]] | ||
* [[http://stackoverflow.com/questions/34888904/function-pointers-as-parameters-in-java-8|function-pointers-as-parameters-in-java-8]] | * [[http://stackoverflow.com/questions/34888904/function-pointers-as-parameters-in-java-8|function-pointers-as-parameters-in-java-8]] | ||
+ | * [[http://blog.dontcareabout.us/2013/03/functional-interfacejava-8.html|functional interface:Java 8 重新製作的概念]] | ||