如何在单个API中支持Java 6、8、9
借助jOOQ 3.7,我們終于添加了對Java 8功能的正式支持。 這為許多不錯(cuò)的改進(jìn)打開了大門,例如:
創(chuàng)建結(jié)果流
try (Stream<Record2<String, String>> stream =DSL.using(configuration).select(FIRST_NAME, LAST_NAME).from(PERSON).stream()) {List<String> people =stream.map(p -> p.value1() + " " + p.value2()).collect(Collectors.toList()); }異步調(diào)用語句(jOOQ 3.8+)
CompletionStage<Record> result = DSL.using(configuration).select(...).from(COMPLEX_TABLE).fetchAsync();result.thenComposing(r -> ...);但是顯然,我們不想讓那些因使用較舊的應(yīng)用程序服務(wù)器而受Java 6困擾的付費(fèi)客戶感到失望。
如何在單個(gè)API中支持多個(gè)Java版本
這就是為什么我們繼續(xù)為商業(yè)客戶發(fā)布Java 6版本的jOOQ 。 我們是怎么做的? 非常簡單地。 我們的商業(yè)代碼庫(這是我們的主要代碼庫)包含大量的“標(biāo)志”,如以下示例所示:
public interface Query extends QueryPart, Attachable /* [java-8] */, AutoCloseable /* [/java-8] */ {int execute() throws DataAccessException;/* [java-8] */CompletionStage<Integer> executeAsync();CompletionStage<Integer> executeAsync(Executor executor);/* [/java-8] */}(當(dāng)然, AutoCloseable在Java 7中已經(jīng)可用,但是我們沒有Java 7版本)。
構(gòu)建jOOQ時(shí),在使用預(yù)處理器從源文件中剝離邏輯之后,我們對其進(jìn)行了多次構(gòu)建:
- 商業(yè)Java 8版本是按原樣構(gòu)建的
- 通過剝離[java-8]和[/java-8]標(biāo)記之間的所有代碼,構(gòu)建第二個(gè)商業(yè)Java 6版本
- 通過向商業(yè)版本添加一些代碼來構(gòu)建商業(yè)免費(fèi)試用版。
- 通過剝離[pro]和[/pro]標(biāo)記之間的所有代碼,構(gòu)建了第三個(gè)開源版本
這種方法的優(yōu)點(diǎn)
與其他方法相比,此方法有幾個(gè)優(yōu)點(diǎn):
- 我們只有一個(gè)真理來源,即原始的商業(yè)源代碼。
- 所有不同版本中的行號均相同
- 這些API在一定程度上是兼容的
- 通過類加載或反射不會涉及任何魔術(shù)
缺點(diǎn)是:
- 提交到存儲庫要慢一些,因?yàn)槲覀冇袔讉€(gè)存儲庫。
- 發(fā)布版本需要更長的時(shí)間,因?yàn)樾枰獦?gòu)建不同的版本并多次測試集成
- 有時(shí),我們只是忘了添加一個(gè)標(biāo)記,而當(dāng)每晚Java-6構(gòu)建崩潰時(shí),我們不得不重新構(gòu)建
- 我們?nèi)匀粺o法在Java 6版本中包含的普通代碼中使用lambda表達(dá)式(大多數(shù)代碼)
我們認(rèn)為,優(yōu)勢明顯勝過。 只要我們的客戶能夠,并且只要那些仍舊使用舊版本的客戶仍然能夠升級到最新的jOOQ版本,就可以實(shí)現(xiàn)一流的Java功能就可以了。
我們期待在不影響現(xiàn)有用戶的情況下支持JDK 9功能,例如模塊化和新的Flow API 。
你呢?
您如何實(shí)現(xiàn)跨JDK版本的兼容性?
翻譯自: https://www.javacodegeeks.com/2016/03/support-java-6-8-9-single-api.html
總結(jié)
以上是生活随笔為你收集整理的如何在单个API中支持Java 6、8、9的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mockito_Mockito和Hamc
- 下一篇: Java中特质模式的定义