這裡有相關的問卷: Local Variable Type Inference for Java1
看來有幾種選項,我個人是比較喜歡 var/val 啦,就像 Scala/Kotlin 一樣
這個喔,var
在 java 不是 keyword,所以如果有人很無聊在 java 8 之前這樣寫程式:
class Container<var> {
void add(var x) {
var y = x;
}
}
然後到 java 9 裡就 compile error 了吧
play+akka+cassandra
不過它的 API 寫起來很奇怪,而且程式排起來也不會很清楚…
public interface HelloService extends Service {
ServiceCall<NotUsed, String, String> sayHello();
default Descriptor descriptor() {
return named("hello").with(
namedCall("hello", sayHello())
);
}
}
Generic parameter 用到三個… 可讀性已經變差了。
Java 8 Stream API 也是很多 generic parameter (多到四個),但是開發者使用 API 時卻藏得很好,程式碼很乾淨。
lagom 的 API 一時之間很難吃的下去,也許要用 scala 腦去思考?還有,因為 API 大多是 async 的緣故,程式碼也是開始堆了好幾層:
public <Id, Request, Response> ServerServiceCall<Id, Request, Response> authenticated(
Function<User, ServerServiceCall<Id, Request, Response>> serviceCall) {
return HeaderServiceCall.composeAsync(requestHeader -> {
// First lookup user
CompletionStage<Optional<User>> userLookup = requestHeader.principal()
.map(principal -> userStorage.lookupUser(principal.getName()))
.orElse(completedFuture(Optional.empty()));
// Then, if it exists, apply it to the service call
return userLookup.thenApply(maybeUser -> {
if (maybeUser.isPresent()) {
return serviceCall.apply(maybeUser.get());
} else {
throw new Forbidden("User must be authenticated to access this service call");
}
});
});
}
看這些程式碼,我實在吃不下去,上面只有三個 if 邏輯而已,卻要寫成這副德性…
十年前 Rod Johnson 說了 J2EE is dead,然後就有了 SpringFramework,當時成為一股風潮。之後 JEE 6 好不容易有跟上的聲勢 (加了一堆 Spring/Hibernate 的概念),一堆 JEE 傳教士紛紛跑出來說不該再用 Spring …
時至今日,cloud 已是佈署的基本款,不管你有沒有用 docker/microservice,你都會想用小 server 裝個小服務 (因 cloud 很適合開一堆小 VM)。什麼都全包的 JEE container 忽然間失去了魅力。然而 Spring 卻在這時推出了 Spring Boot,一整個打中潮流和需求點,於是 JEE 再度被 Spring 打敗一次。這篇文章也點出大廠都不把心力放在 JEE 上了,跑去搞 cloud,JEE8/9 沒有任何下文…
Spring 當初打的名號是 lightweight container,每個元件都是可以隨需求自己加上去,不用硬包在一起,這個起步式在十幾年前是對的,到了現在還是對的。這並不是風水輪流轉的緣故,而是這是軟體界永遠不變的真理。
Spring 中期也是搞錯好幾次方向,像是 Ruby on Rails 剛興起時,Spring 也跟風去搞什麼 Groovy,然後又做 command line 工具 spring root,可以像 Rails 一樣幾個指令就生一個 scaffolding。結果 Rails 潮流結束後這些東西就乏人問津。接下來 Spring 又去搞 OSGi,這也是浪費了無數的資源,去完成一件錯誤的產品 (太難懂、太難用、沒有迫切需求… ),接下來就被 VMWare 給買下了。
話說回來,Spring Boot 這新產品很受大家喜歡,歷經中期一連串的失敗還能再站起來還真是不簡單。Spring Boot 當然是跟上現在的 cloud/microservice 潮流才會起飛,但這產品在十年前出的話,我自己也會想用,所以也不盡然是風潮的關係。我想是因為它真正解決了問題 (簡化設定和佈署),又沒有增加任何難度 (你不用再多學一套工具像是 docker 什麼的,它終究是個 .jar
而已)。
----
老骨頭講古講完了… 說實在的,新生代 web 開發者選擇後端的話,通常是 nodejs > rails > 其他平台
這種順序,Spring 再好也是老骨頭才會去選吧。