java:8最小镜像_Java:本地最小语言
java:8最小鏡像
在1996年至2002年之間,我用Java編寫了成千上萬(wàn)行代碼。我用Java 1.0到Java 1.4編寫了Web框架,電子表格以及更多內(nèi)容。
與90年代中期(預(yù)模板)的C ++相比,Java是一種完全令人驚奇的語(yǔ)言。 JVM是所有計(jì)算機(jī)語(yǔ)言的最佳運(yùn)行時(shí)。
漫長(zhǎng)的奇異之旅
從2002年開始,我開始做C#。 然后是露比 然后是Scala。 一些Haskell,最近,我做了很多Clojure。
因此,我今年完成的Java 1.5 / Generics數(shù)量非常有限。
有一個(gè)Java演出
今年,我參加了一場(chǎng)演出,寫了一些非常有趣的代碼(編寫了一個(gè)編譯器)。 但是,客戶是一家Java商店。 該項(xiàng)目已經(jīng)具有Java基礎(chǔ)。 客戶堅(jiān)決認(rèn)為該項(xiàng)目全部用Java來(lái)完成……不是Scala……不是Clojure……不是JRuby,而是Java。
因此,過(guò)去6個(gè)月中,我花了數(shù)千行Java代碼。 我已經(jīng)看到Java在過(guò)去10年中如何發(fā)展,這令人震驚。 令人震驚的Java變得多么糟糕。
基本上,Java毫無(wú)意義。 據(jù)我所知,泛型將給定程序的總字符數(shù)增加約20%-30%。 雖然Scala的類型(帶有類型推斷)與Ruby相比是純正的(在我看來(lái),陪審團(tuán)無(wú)法確定Scala的類型系統(tǒng)的重量與它相對(duì)于類型較少的Clojure的價(jià)值。)Java令人驚訝的冗長(zhǎng),視覺(jué)分散,丑陋的東西我可以想到泛型不值得在類型檢查與Java 1.4的邊際改進(jìn)之間進(jìn)行。
因此,我將介紹我認(rèn)為可以使Java更好而又不會(huì)破壞語(yǔ)言的東西。
這不是“ Scala更好的帖子”
請(qǐng)注意,該帖子不是“ Scala更好”的帖子。 盡管文章中的某些想法來(lái)自Scala,但我認(rèn)為Scala(或Clojure)不能替代Java。 Scala只是一種語(yǔ)言,我已經(jīng)看到大量的Scala濫用。
此外,我認(rèn)為Scala在很大程度上已經(jīng)遭受了Java的同樣痛苦(增加了語(yǔ)言的負(fù)擔(dān)和復(fù)雜性(主要是通過(guò)Scala的類型系統(tǒng))來(lái)解決邊際問(wèn)題),考慮到兩種語(yǔ)言,這不足為奇的血統(tǒng)。
有些東西可能是在JDK 8中提出或提出的
這些是我的想法。 我不是JCP地區(qū)的球員。 感謝與Sam Pullara的出色午餐,我了解Java 8中的lambda。 但是我沒(méi)有處理太多的JCP流量,因此JCP提案可能涵蓋了這些想法。
默認(rèn)公開
除非有明確的可見性級(jí)別,否則將所有聲明默認(rèn)為public 。 是的,我知道這會(huì)破壞現(xiàn)有的一些代碼,但是讓我們將默認(rèn)值設(shè)置為正確的值即可。
為什么? 由于我們的代碼中包含的噪聲越少,信號(hào)越突出。
最后一個(gè)表達(dá)式是返回值
信號(hào)變得更有價(jià)值的另一個(gè)地方不再需要return關(guān)鍵字。 最后一個(gè)表達(dá)式成為返回值:
int plusOne(int x) {x + 1;}僅當(dāng)方法中沒(méi)有return語(yǔ)句時(shí)才適用。 因此,如果您打算將return用于控制流編程,則必須明確。 但是對(duì)于小型,簡(jiǎn)單的方法,擺脫return意味著更少的視覺(jué)噪音。
塊表達(dá)式
花括號(hào)中的任何內(nèi)容都是一個(gè)塊表達(dá)式,而不是一個(gè)塊語(yǔ)句。 這意味著如果花括號(hào)的東西可以是一個(gè)表達(dá)式,則將其視為此類。
String s = {var d = new Date();"The current date is "+d; }某種類型推斷
我希望看到自動(dòng)分配推斷。 基本上:
var name = "David"; // it's a String, duh我們不需要使var為關(guān)鍵字。 基本上,類型var成為“推斷類型”類型。
和基本的左側(cè)參數(shù)類型推斷(請(qǐng)注意,IntelliJ已經(jīng)使用此語(yǔ)法):
List<String> stuff = new ArrayList<~>();如果返回值只有一條路徑(除了方法的最后一行,沒(méi)有return語(yǔ)句),則返回類型推斷:
plusOne(int x) // it's an int{x + 1;}以上所有更改都可以使用編譯器已知的數(shù)據(jù)來(lái)完成。 無(wú)需花哨的算法。 只是減少了程序中重復(fù)單詞的數(shù)量……而通過(guò)泛型類型推斷,無(wú)論如何,IDE都已經(jīng)顯示了它們。
更好的平等測(cè)試
將===添加為equals方法的別名,但要求===的右側(cè)與右側(cè)協(xié)變。
另外,將!==添加為!equals 。
具有元數(shù)據(jù)的簡(jiǎn)單,不可變的數(shù)據(jù)結(jié)構(gòu)
用Java表示簡(jiǎn)單數(shù)據(jù)是一個(gè)巨大的痛苦。 是的,IDE在創(chuàng)建getter / setter方面大有幫助。 但是最終,我們的許多程序都包含原始數(shù)據(jù)。 因此,我建議向Java添加內(nèi)部數(shù)據(jù)結(jié)構(gòu)。
這些是Scala的案例類與Clojure的元數(shù)據(jù)工具的組合。
struct只能在頂級(jí)公共類中。
例如:
public class MyStuff {struct Name(firstName = "David", lastName = "Pollak", age = 49, Date birthday = null)public static boolean funWithNames() {var archer = Name("Archer").age(10);var tessa = Name().firstName("Tessa").lastName("kitten").age(1);assert(tessa.age === 1);assert(tessa.getAge() === 1);archer !== tessa;}public static void metaData() {var david = Name("David", "Pollak");Name d2 = david.setMeta("geek", "true");assert(david === d2); // metadata not part of equality testingassert(david != d2); // object instances not the sameassert(david.getMeta("geek") === null);assert(d2.getMeta("geek") === "true");} }你從struct得到什么?
- 不可變對(duì)象的創(chuàng)建,無(wú)需使用每個(gè)參數(shù)的new且具有位置構(gòu)造函數(shù),以及簡(jiǎn)單的名義上的創(chuàng)建和新值鏈接。
- 與每個(gè)struct相關(guān)聯(lián)的元數(shù)據(jù)的Map<String, String> 。
- 每個(gè)字段的默認(rèn)值。 這允許添加字段,并且?guī)в懈郊訁?shù)的新版本庫(kù)不會(huì)破壞訪問(wèn)舊版本的代碼。
- 一個(gè)toString方法,它輸出字段名稱和值。
- 一個(gè)正確實(shí)現(xiàn)的equals方法,可以通過(guò)對(duì)空字段的適當(dāng)處理來(lái)進(jìn)行所有字段比較。
- 計(jì)算哈希碼的hashCode方法(如果已知所有字段都是不可變的,則應(yīng)將其緩存)。
- 字段級(jí)訪問(wèn)器方法。
- 每字段復(fù)印機(jī): field(param)這允許創(chuàng)建具有新值的新實(shí)例。 元數(shù)據(jù)已復(fù)制。
- 每個(gè)struct都有大量的元數(shù)據(jù),包括字段名稱列表,每個(gè)字段的類型。 該元數(shù)據(jù)可用于快速,高效,自動(dòng)生成的一組序列化器/反序列化器(例如JSON,JDBC,XML)。
另外,請(qǐng)注意定義的語(yǔ)法。 如果可以,則推斷類型。
對(duì)于每個(gè)包含struct類,將有一個(gè)ClassName.struct接口。 該接口由所有struct實(shí)現(xiàn),并且該接口包含所有共享字段。 例如:
class People {struct Parent(String name = null, List<People.struct> kids = null)struct Kid(String name = null, Parent parent = null)String getName(struct person) {person.name;} }注解也可以完成很多事情(例如,增強(qiáng)struct的JSON可序列struct等)
但是,采用輕量級(jí)的方法在語(yǔ)言級(jí)別定義數(shù)據(jù)模式可以使代碼編寫更快,更易于維護(hù)并且更具可讀性。
精鑄
Java轉(zhuǎn)換過(guò)于冗長(zhǎng)且容易出錯(cuò)。 使用if / instanceof / cast模式需要大量代碼,并且非常容易出錯(cuò),因?yàn)樵擃惐恢付藘纱巍淮卧跍y(cè)試中,一次在強(qiáng)制轉(zhuǎn)換中。
我們可以從Scala借用我最喜歡的功能之一:模式匹配,但是只需執(zhí)行以下操作:
String testIt(Object o) {switch o {String s: s;Number n: "It's a number: "+n;Date d if d.millis() > 0: {var formattedDate = formatDate(d);"It's a modern date: "+formattedDate;}default: "No clue";} }好吧...我們有什么? 該類已測(cè)試。 如果類是匹配項(xiàng),則將其分配給變量(僅具有行范圍)。 接下來(lái),運(yùn)行警衛(wèi),看看是否應(yīng)該采取這種行動(dòng)。 如果是這樣,請(qǐng)運(yùn)行:右側(cè)的表達(dá)式。
請(qǐng)注意,這種形式的切換是一種表達(dá)方式,而不是一條聲明。 另外,請(qǐng)注意,不會(huì)掉線。
那么,這還能使事情變得更容易嗎?
String whatSize(int i) {switch i {v if s < 10 : "small";v if s < 100 : "medium";default: "large";} }接下來(lái)我們可以將它應(yīng)用于struct s(不,這不是模式匹配):
String aboutPerson(People.struct p) {switch p all {Parent p: "A parent named "+p.name+" #"+p.kids.size();Kid k: "A kid with "+(k.parent.kids.size() - 1)+" sibs";} }express之后的all關(guān)鍵字表示必須匹配。 如果將新的struct添加到類中,這將很有用,因?yàn)樗性谠搒truct上打開的位置都將標(biāo)記一個(gè)編譯時(shí)錯(cuò)誤。
不變的收藏
Java迫切需要一個(gè)出色的不可變集合包。
基本上,該軟件包是Clojure出色的Map和Vector類的純粹復(fù)制品。 我們不需要很多花哨的Scala風(fēng)格的收藏。
不實(shí)現(xiàn)java.util.List或java.util.Map不可變集合。 基本上,這些集合將是獨(dú)立的。
與JDK 8 lambda結(jié)合使用時(shí),我會(huì)從Scala和Clojure那里獲得我在收集操作方面的全部心血。
所以你有它
所以你有它。 我認(rèn)為以上內(nèi)容將使Java更易于處理語(yǔ)言。 它將減少冗長(zhǎng)。 它將允許將數(shù)據(jù)作為相當(dāng)普遍的數(shù)據(jù)進(jìn)行處理,尤其是在編寫將數(shù)據(jù)編組進(jìn)出系統(tǒng)的服務(wù)時(shí)。
上述更改將減少Java的冗長(zhǎng)性,而不會(huì)顯著降低Java的“講述故事”代碼。 而且,是的,有可能編寫相當(dāng)難以理解的Scala代碼。 我們不想去Scala去的地方。
我還想看什么? 按名稱調(diào)用參數(shù)(我不知道它們是否會(huì)成為lambda的一部分)。 屬性。 看看是否有可能在Java中進(jìn)行某種形式的全局類型推斷也將很有趣。 但是所有這些東西都是另一天。
繼續(xù)前進(jìn)!
翻譯自: https://www.javacodegeeks.com/2013/10/java-a-local-minimum-language-wise.html
java:8最小鏡像
總結(jié)
以上是生活随笔為你收集整理的java:8最小镜像_Java:本地最小语言的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓机手柄映射(安卓机手柄)
- 下一篇: 邪恶的Java技巧使JVM忘记检查异常