Java Versioning
Java merupakan bahasa pemrograman Object yang sering merilis versi terbaru. Update ini ditujukan untuk perbaikan security problem dan peningkatan performa Java. Dalam update versi JDK (Java Development Kit) ini sering ada fitur yang dihapus maupun ditambahkan, berikut jadwal rilis JDK beserta detail JDK versi terkait : (pembahasan dimulai dari JDK 7)
JDK 7 rilis July 2011
JDK 7 mengikuttsertakan fitur diantaranya :
- JVM mendukung dynamic language dengan
invokedynamic
bytecode, dimana value di binding ke bytecode - Kompresi 64 bit pointer
- Utilitas Concurency
JDK 8 (LTS) rilis March 2014
Berikut beberapa fitur signifikan pada Java 8 :
- Lambda expression — Menambahkan kemampuan pemrosesan fungsional ke Java.
- Method references — Mengacu fungsi dengan memanggil secara langsung. Menggunakan fungsi sebagai parameter.
- Default method — Interface memiliki implementasi metode default.
- New tools — Alat dan utilitas kompiler baru ditambahkan seperti ‘jdeps’ untuk mengetahui dependensi.
- Stream API — Stream API baru untuk memfasilitasi proses pipeline.
- Date Time API — peningkatan pada date time API.
- Optional — Penekanan pada praktik terbaik untuk menangani nilai null dengan benar.
- Nashorn, JavaScript Engine — Mesin berbasis Java untuk mengeksekusi kode JavaScript.
JDK 9 rilis September 2017
Beberapa fitur dan peningkatan pada Java 9 adalah:
- Java 9 REPL (JShell)
Tool REPL (Read Evaluate Print Loop) ini digunakan untuk mengeksekusi dan menguji Java Constructs seperti class, interface, enum, objek, pernyataan-pernyataan dan sebagainya dengan sangat mudah.
- Factory method untuk immutable List, Set, Map dan Map.Entry
Metode utilitas ini digunakan untuk membuat objek kosong atau tidak kosong dari Collection ( objek immutable List, Set, Map, dan Map.Entry ).
- Method private pada interface
Versi sebelumnya interface dapat dibuat default & static tapi tidak private, kini itu bisa.
- Sistem modul Java 9
Modul Sistem : Modular JDK, Encapsulate Java Internal API, Sistem Modul Platform Java.
- Peningkatan pada Proses API
Method baru untuk memudahkan pengendalian dan pengelolaan proses pada OS, dapat ditemukan pada package java.lang.ProcessHandle.
- Peningkatan pada try exception handling
Peningkatan readibility pada try-with-resources.
- Reactive Streams
Java SE 9 Reactive Streams API adalah Publish / Subscribe Framework untuk mengimplementasikan aplikasi asynchronous, scalable dan parallel dengan sangat mudah menggunakan bahasa Java, dapat ditemukan pada java.util.concurrent.Flow.
- Diamond Operator Untuk Inner Class Anonymous
Fitur baru yaitu Diamond Operator untuk menghindari kode yang tidak efisien dan verbositas yang berlebihan sehingga dapat meningkatkan readability.
- Method baru pada class java.util.Optional
Method method stream() akan bekerja dengan objek Optional.
- Peningkatan pada Stream API
Method dropWhile dan takeWhile pada interface java.util.Stream.
- Penyempurnaan pada anotasi @Deprecated
Di versi sebelumnya @Deprecated hanyalah Marker interface tanpa method apapun, kini mendapat peningkatan sehingga menyediakan tool untuk menganalisis penggunaan aplikasi static API dari deprecated API.
- HTTP 2 Client
HTTP 2 Client API Baru untuk mendukung protokol HTTP / 2 dan fitur WebSocket di package “java.net.http”, juga mendukung Synchronous (Blocking Mode) dan Asynchronous Modes sekaligus mendukung Asynchronous Mode menggunakan WebSocket API
- Multi-Resolution Image API
API Multi-Resolution Image pada package java.awt.image dan MultiResolutionmage mengenkapsulasi satu set gambar dengan tinggi dan lebar yang berbeda.
- Peningkatan Kinerja Sistem
GC (Garbage Collector, Serialization Data, HTML 5 JavaDoc, JavaDoc Search, Compact Strings)
JDK 10 rilis March 2018
Beberapa peningkatan pada Java 10 adalah:
- Inferensi Tipe Variabel Lokal: Meningkatkan bahasa Java untuk memperluas tipe inferensi ke deklarasi variabel lokal dengan menggunakan initializers. Oleh karena itu, Java memperkenalkan var, yang merupakan sesuatu yang umum dan biasa digunakan dalam bahasa pemrograman lainnya.
- Menggabungkan berbagai repositori JDK forest ke dalam satu repositori (tunggal) : untuk menyederhanakan dan merampingkan development.
- Garbage Collector (GC) Interface: Meningkatkan isolasi source code dari garbage collector berbeda dengan memperkenalkan interface garbage collector (GC) yang bersih.
- Application Data-Class Sharing: Untuk meningkatkan startup dan footprint, JEP ini memperluas fitur Class-Data Sharing (“CDS”) yang ada untuk memungkinkan kelas aplikasi ditempatkan dalam arsip bersama.
- Thread-Local Handshakes: Memperkenalkan cara melakukan callback pada thread tanpa harus melakukan safe point VM secara global. Membuatnya menjadi mungkin dan murah untuk menghentikan thread tunggal dan tidak hanya semua thread atau tidak satu pun.
- Menghapus tool Native-Header Generator, dengan menghapus javah tool dari JDK karena telah digantikan oleh keunggulan fungsionalitas di javac.
- Ekstensi tambahan pada Unicode Language-Tag: Peningkatkan pada java.util.Locale dan API terkait untuk mengimplementasikan ekstensi Unicode tambahan dari tag bahasa BCP 47.
- Alokasi Heap pada Perangkat Memori Alternatif: Ini memungkinkan HotSpot VM untuk mengalokasikan objek heap Java pada perangkat memori alternatif, seperti NV-DIMM, yang dapat ditentukan oleh pengguna.
- Versi Rilis Berbasis Waktu: Merevisi skema versi-string dari Java SE Platform dan JDK, dan informasi versi terkait, untuk model rilis berbasis waktu saat ini dan masa yang akan datang.
JDK 11 (LTS) rilis September 2018
Beberapa yang baru dan dihilangkan di versi ini adalah
- Menghilangkan Java EE, CORBA, Java Applets dan Java FX dari JDK.
- Eksekusi Langsung Program Java
Jika sebelumnya kita perlu untuk mengkompilasi class dengan javac
sekarang bisa langsung menjalankan kompilasi running Java dengan java misalNamaFile.java
- JavaScript Nashor Engine akan dihapus
Engine ini merupakan runtime engine seperti V8 Enginge pada NodeJs untuk menjalankan JavaScript diatas JVM (Java Virtual Machine).
- Method baru pada String
Penambahan ini meliputi :
- repeat( )
Mengulang atau membuat perulangan pada String.
- strip( )
Mirip dengan trim( ) namun lebih jelas strip() terdiri dari stripTrailing( ) dan stripLeading( ), yang menghapus whitespaces dari belakang dan depan.
- isEmpty( ) dan isBlank ( )
Method isEmpty()
hanya akan bernilai true
saat sebuah string diisi dengan ""
. Apabila kita isi dengan spasi seperti ini: " "
, maka method isEmpty()
akan mengembalikan nilai false
.
Sedangkan isBlank()
lebih cerdas. Ia mampu mengetahui, kalau isi string tersebut adalah spasi (white space).
- lines( )
Method ini berfungsi untuk mengekstrak sebuah string menjadi Stream berdasarkan garis baru.
- Method baru pada class Files
Terdapat dua method baru:
readString()
untuk membaca teks string dari File;
import java.nio.file.Path;
import java.nio.file.Files;
import java.io.IOException;
public class BacaFile {
public static void main(String[] args) throws IOException {
var fileName = "words.txt";
var data = Files.readString(Path.of("words.txt"));
System.out.println(data);
}
}
Lebih mudah baca file dari Java tidak seperti sebelumnya yang menggunakan BufferedReader.
2. writeString()
untuk menulis teks string ke File.
import java.nio.file.Path;
import java.nio.file.Files;
import java.io.IOException;
public class TulisFile {
public static void main(String[] args) throws IOException {
var words = "Tutorial java untuk pemula\noleh: Petani Kode";
Files.writeString(Path.of("words.txt"), words);
}
}
- HTTP Client kini menjadi Library Standar
Pada Java versi sebelumnya, Kita bisa melakukan HTTP Request dengan class HttpURLConnection
. Namun class ini mengalami kendala seprti sulit dimaintain, tidak mendukung multithread, dokumentasi minim.
Alternatifnya Kita akan menggunakan library pihak ketiga seperti Unirest, OkHTTP, Apache HTTP Client, Android Asynchronous Http Client, dsb.
Kini method HTTP Client tersebut sudah berada di library bawaan Java di package java.net.http . Berikut contohnya
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
public class RequestPetanikode {
public static void main(String[] args) {
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://www.petanikode.com"))
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
}
}
hasil runningnya
Biasanya library ini digunakan untuk : Mengakses Restful API atau Webservices, Scrape pada data Web, Membuat Bot dsb.
JDK 12 rilis March 2019
Beberapa yang baru dan dihilangkan di versi ini adalah
- Switch Expressions
Syntax barunya adalah L ->
, syntax baru ini menghilangkan kebutuhan break untuk mencegah kegagalan. Ambil contoh suatu kode dengan syntax versi lama
String result = "";
switch (day) {
case "M":
case "W":
case "F": {
result = "MWF";
break;
}
case "T":
case "TH":
case "S": {
result = "TTS";
break;
} };
System.out.println("Old Switch Result:"); System.out.println(result);
pada syntax baru akan berubah menjadi
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(day.isEmpty())
break "Please insert a valid day.";
else
break "Looks like a Sunday.";
} }; System.out.println(result);
- File mismatch() Method
Method yang akan mengembalikan posisi dari first mismatch or -1L jika tidak terdapat mismatch.
public static long mismatch(Path path, Path path2) throws IOException
- Compact Number Formatting
Memungkinkan untuk memformat dan memparsing representasi numerik dalam bentuk compact
baik long
maupun short
- Java Strings New Methods
4 method baru yang diperkenalkan pada Java 12 which are
- indent(int n)
- transform(Function f)
- Optional describeConstable()
- String resolveConstantDesc(MethodHandles.Lookup lookup)
Method tersebut meliputi indentasi , transformasi string, method untuk constable interface dan implementasi class String dan method untuk memisahkan instance dari ConstantDesc.
- JVM Changes EP 189, JEP 346, JEP 344, and JEP 230.
Mengacu pada kode yang terkait dengan Garbage Collector agar lebih optimal kinerjanya.
JDK 13 rilis September 2019
Beberapa yang baru dan dihilangkan di versi ini adalah
- Perbaikan untuk
switch
expression
Penggantian keyword break
in the switch expression by yield
, untuk keluar dari switch
dan mengembalikan hasil dari branch. Pada syntax switch
versi lama
// Switch-Statement with breakprivate static String statementBreak(int switchArg){
String str = "not set";switch (switchArg){case 1:
case 2:
str = "one or two";
break;case 3:
str = "three";
break;};
return str;
}
dan dengan syntax baru akan menjadi
// Switch-Expression with yieldprivate static String expressionBreakWithValue(int switchArg){return switch (switchArg){case 1, 2: yield "one or two";
case 3: yield "three";default: yield "smaller than one or bigger than three";}; }
- Penggunaan text block daripada raw string literals
Dengan tanpa text blok (raw string literal)
// Without Text BlocksString html = "<html>\n" +" <body>\n" +" <p>Hello, Escapes</p>\n" +" </body>\n" +"</html>\n";
Dengan text blok
// With Text BlocksString html = """<html><body><p>Hello, Text Blocks</p></body></html>""";
- Dynamic CDS (Class Data Sharing)
Berguna untuk mepersingkat waktu mulai aplikasi Java dengan menyimpan informasi tertentu tentang class dalam arsip CDS (Class Data Sharing). Dataini dapat dimuat saat runtime dan dipergunakan oleh JVM.
- ZGC (Z Garbage Collector) mengembalikan unused strorage
Perbaikan pengaturan memori guna menhandle ribuan user dalam satu waktu. ZGC menjanjikan jeda yang sangat singkat ketika membersihkan heap memory dengan beberapa terabytes.
- Pembaruan Socket APIs
Perbaikan dari java.net Socket
dan java.net.ServerSocket API
dari pengembangan JDK 1.0. Kemudian pengembangan NioSocketImpl
sebagai implementasi I/O dan infrastruktur terkini untuk mengganti versi terdahulu NioSocketImpl
JDK 14 rilis March 2020
Saat artikel ini dibuat belum tahun rilis tersebut.
JDK 15 rilis September 2020
Saat artikel ini dibuat belum tahun rilis tersebut.
JDK 16 rilis March 2021
Saat artikel ini dibuat belum tahun rilis tersebut.
JDK 17 (LTS) rilis September 2021
Saat artikel ini dibuat belum tahun rilis tersebut.
Referensi :
- https://en.wikipedia.org/wiki/Java_version_history
- https://www.community-java.com/2017/04/fitur-baru-yang-ditambahkan-ke-java-8.html
- http://bahasajava.com/java-10-fitur-peningkatan/
- http://bahasajava.com/java-9-fitur-baru-dan-peningkatan-lainnya/
- https://www.petanikode.com/java-11/
- https://jaxenter.com/java-13-jdk-deep-dive-new-features-162272.html