Coding Your Way to
Java 13
@Sander_Mak
About Sander
Director of Technology
@ Picnic
Conference Speaker & Author
@Sander_Mak
Java
13
(Sept. 2017)
@Sander_Mak
Preview Feature: Text Blocks
String jsonOrIsIt = "{n" +
" "no": "escaping for nested strings!",n" +
" "preserves_indentation?": true,n" +
" "awesomeness_level": 11n" +
"}";
@Sander_Mak
Preview Feature: Text Blocks
String json = """
{
"no": "escaping for nested strings!",
"preserves_indentation?": true,
"awesomeness_level": 11
}""";
@Sander_Mak
Java
12
(March 2019)
@Sander_Mak
Switch
Statements
int numletters;
switch (day) {
case MONDAY:
FRIDAY:
SUNDAY: numletters = 6;
break;
case TUESDAY: numletters = 7;
break;
case THURSDAY:
SATURDAY: numletters = 8;
break;
case WEDNESDAY: numletters = 9;
break;
}
@Sander_Mak
Preview Feature: Switch Expression
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
@Sander_Mak
Java
11
(Sept. 2018)
@Sander_Mak
HttpClient
HttpURLConnection
@Sander_Mak
HttpClient
HttpURLConnection
HTTP/2 & WebSocket
Reactive Streams Support
@Sander_Mak
HttpClient
send
sendAsync
...
HttpClient
@Sander_Mak
HttpClient
send
sendAsync
...
HttpClient.Builder
newBuilder
HttpClient
@Sander_Mak
HttpClient
send
sendAsync
...
HttpClient.Builder
HttpRequest
uri
headers
method
...newBuilder
HttpClient
@Sander_Mak
HttpClient
send
sendAsync
...
HttpClient.Builder
HttpRequest
uri
headers
method
...
HttpRequest.Builder
newBuilder
newBuilder
HttpClient
@Sander_Mak
HttpClient
send
sendAsync
...
HttpClient.Builder
HttpRequest
uri
headers
method
...
HttpRequest.Builder
HttpResponse
uri
statusCode
body
...newBuilder
newBuilder
HttpClient
@Sander_Mak
HttpClient
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://google.com"))
.GET()
.build();
HttpResponse<String> response = httpClient.send(req, BodyHandlers.ofString())
@Sander_Mak
Java
@Sander_Mak
Java
9
(Sept. 2017)
@Sander_Mak
R
jshell
E
P
L
@Sander_Mak
R
jshell
E
P
L
ead
@Sander_Mak
R
jshell
E
P
L
ead
val
@Sander_Mak
R
jshell
E
P
L
ead
val
rint
@Sander_Mak
R
jshell
E
P
L
ead
val
rint
oop
@Sander_Mak
R
jshell
E
P
L
ead
val
rint
oop
Input code
@Sander_Mak
R
jshell
E
P
L
ead
val
rint
oop
Input code
Run code
@Sander_Mak
R
jshell
E
P
L
ead
val
rint
oop
Input code
Run code
See results
@Sander_Mak
R
jshell
E
P
L
ead
val
rint
oop
Input code
Run code
See results
Iteratively refine
@Sander_Mak
jshell
DEMO
@Sander_Mak
Java
10
(March 2018)
@Sander_Mak
var
@Sander_Mak
var
String name = "Sander";
@Sander_Mak
var
String name = "Sander";
public void aMethod() {
String name = "Sander";
}
@Sander_Mak
var
String name = "Sander";
public void aMethod() {
String name = "Sander";
}
public void aMethod() {
var name = "Sander";
}
@Sander_Mak
var
URL url = new URL("https://javamodularity.com");
URLConnection connection = url.openConnection();
BufferedInputStream inputStream =
new BufferedInputStream(connection.getInputStream());
@Sander_Mak
var
URL url = new URL("https://javamodularity.com");
URLConnection connection = url.openConnection();
BufferedInputStream inputStream =
new BufferedInputStream(connection.getInputStream());
var bookurl = new URL("https://javamodularity.com");
var connection = bookurl.openConnection();
var bookStream = new BufferedInputStream(connection.getInputStream());
@Sander_Mak
var
URL url = new URL("https://javamodularity.com");
URLConnection connection = url.openConnection();
BufferedInputStream inputStream =
new BufferedInputStream(connection.getInputStream());
var bookurl = new URL("https://javamodularity.com");
var connection = bookurl.openConnection();
var bookStream = new BufferedInputStream(connection.getInputStream());
@Sander_Mak
var
URL url = new URL("https://javamodularity.com");
URLConnection connection = url.openConnection();
BufferedInputStream inputStream =
new BufferedInputStream(connection.getInputStream());
var bookurl = new URL("https://javamodularity.com");
var connection = bookurl.openConnection();
var bookStream = new BufferedInputStream(connection.getInputStream());
DEMO
@Sander_Mak
Java
9
(Sept. 2017)
@Sander_Mak
Collection Factory Methods
@Sander_Mak
List<String> books = new ArrayList<>();
books.add("Java 9 Modularity");
books.add("Designing Data-Intensive Applications");
books.add("Java 8 Lambdas");
Collection Factory Methods
@Sander_Mak
Collection Factory Methods
List<String> books = List.of("Java 9 Modularity",
"Designing Data-Intensive Applications",
"Java 8 Lambdas");
@Sander_Mak
Collection Factory Methods
List<String> books = List.of("Java 9 Modularity",
"Designing Data-Intensive Applications",
"Java 8 Lambdas");
Set.of Map.of
@Sander_Mak
Quick Java Module Overview
@Sander_Mak
module main {
}
module-info.java
Module Declarations
@Sander_Mak
module main {
}
module-info.java
Module Declarations
main.web
main.persistence
main.integration
main
@Sander_Mak
module main {
requires helper;
}
module-info.java
module helper {
}
module-info.java
Explicit Dependencies
main.web
main.persistence
main.integration
main
@Sander_Mak
module main {
requires helper;
}
module-info.java
module helper {
}
module-info.java
helper
Explicit Dependencies
main.web
main.persistence
main.integration
main
@Sander_Mak
module main {
requires helper;
}
module helper {
exports helper.api;
}
module-info.java module-info.java
helper.api
helper
Well-defined Interfaces
main.web
main.persistence
main.integration
main
@Sander_Mak
module main {
requires helper;
}
module helper {
exports helper.api;
}
module-info.java module-info.java
helper.api
helper.impl
helper
Strong Encapsulation
main.web
main.persistence
main.integration
main
@Sander_Mak
Demo: EasyText
easytext.cli
easytext.analysis
@Sander_Mak
Why?
@Sander_Mak
Why?
Modular JDK
@Sander_Mak
Why?
Modular JDK
Maintainability
Reliable composition
Flexibility
@Sander_Mak
quick refresher
why/advantages
(JDK: modularized, your app: architecture from whiteboard to code, explicit dependencies in language, strong encapsulation, jlink
Why?
Decrease the model-code gap
@Sander_Mak
jlink
@Sander_Mak
jlink
+
main
lib1 lib2
jdk
~300mb
application
~2mb
@Sander_Mak
jlink
+
main
lib1 lib2
jdk
~300mb
application
~2mb JVM
main
lib1 lib2
java.base
java.logging
java.xml
Custom Run-time Image
~25mb
@Sander_Mak
jlink
+
main
lib1 lib2
jdk
~300mb
application
~2mb JVM
main
lib1 lib2
java.base
java.logging
java.xml
Custom Run-time Image
@Sander_Mak
IoT Device
jlink
+
main
lib1 lib2
jdk
~300mb
application
~2mb JVM
main
lib1 lib2
java.base
java.logging
java.xml
Custom Run-time Image
@Sander_Mak
Impact on Java 8 codebases
@Sander_Mak
Impact on Java 8 codebases
Use of encapsulated JDK types:
Run-time warnings
Compile-time errors
@Sander_Mak
Impact on Java 8 codebases
Use of encapsulated JDK types:
Run-time warnings
Compile-time errors
Use of enterprise APIs in JDK:
Won't resolve by default
Gone in Java 11!
java.corba
java.xml.bind
java.xml.ws.*
java.activation
java.transaction
@Sander_Mak
Let's Talk About Adoption
@Sander_Mak
https://jaxenter.com/java-8-still-strong-java-10-142642.html
@Sander_Mak
https://jaxenter.com/java-8-still-strong-java-10-142642.html
https://www.baeldung.com/java-in-2018
@Sander_Mak
https://jaxenter.com/java-8-still-strong-java-10-142642.html
https://www.baeldung.com/java-in-2018
https://www.jetbrains.com/research/devecosystem-2018/java/
@Sander_Mak
https://jaxenter.com/java-8-still-strong-java-10-142642.html
https://www.baeldung.com/java-in-2018
https://www.jetbrains.com/research/devecosystem-2018/java/
Java Magazine & Snyk
@Sander_Mak
https://jaxenter.com/java-8-still-strong-java-10-142642.html
https://www.baeldung.com/java-in-2018
https://www.jetbrains.com/research/devecosystem-2018/java/
Java Magazine & Snyk
@Sander_Mak
Java 11
@Sander_Mak
Java 11
Java 9
Java 10
Java 12
Java 13
6 months
Java 11
@Sander_Mak
Java 11
Java 9
Java 10
Java 12
Java 13
6 months
Java 11
@Sander_Mak
Java 11
Long
Term
Support
Java 9
Java 10
Java 12
Java 13
6 months
Java 11 Java 11 LTS
minimum 3 years
@Sander_Mak
Which JDK?
JDK 11 changes the game
@Sander_Mak
Oracle JDK 8
Binary Code License
@Sander_Mak
Oracle JDK 8
Binary Code License
Oracle JDK 11
Java SE Subscription
$
@Sander_Mak
Oracle JDK 8
Binary Code License
Oracle JDK 11
Java SE Subscription
$
OpenJDK 11
GPL v2
@Sander_Mak
Oracle JDK 8
Binary Code License
Oracle JDK 11
Java SE Subscription
$
OpenJDK 11
GPL v2
=
@Sander_Mak
Oracle JDK 8
Binary Code License
Oracle JDK 11
Java SE Subscription
$
OpenJDK 11
GPL v2
Amazon Corretto
AdoptOpenJDK
Red Hat OpenJDK
Azul Zulu
=
Thanks. Join us:
join.picnic.app
@Sander_Mak
bit.ly/ps-sander

Coding Your Way to Java 13