Java Versioning

Alfian Rahman
8 min readNov 27, 2019

--

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:

  1. 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 breakin 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 :

--

--