# JAVA 8 to 18
## Coding style changes
- Automatic type inference: It is not required to define the exact class for the variable
- Example: ```var url = new URL("dummy.com");```
- Simpler switch statements
- Can omit default if the switches are exhaustive
- Can switch on variable datatype
- Can test for null inside switch statement
- Guarded patterns: Can combine multiple conditions
- Example: ```case String s when s.size()==1 -> evaluate
- Text blocks
- Record classes: Final classes with only contructor for carrying around data
- Pattern matching using ```instanceof```
- ```obj instanceof string s```: Checks if obj is of type string, creates a new variable s and casts obj into s
- Sealed classes: Restrict the use of classes or interfaces by restricting the classes who can extend, implement them
## JDK changes
- Null Pointer Exceptions: Pinpoints the variable which gives NPE
- Java Linker( jlink)
- Creates "Custom Runtime"
- Allows us to use the subset of java modules which are required by the application
- Reduces file size of the compiled file
- Java Dependency Analyzer( jdep)
- Shows package and class level dependencies of JAVA class files
- The result can be used in jlink to reduce the number of dependecies
- Java Packager( jpackage)
- Can create native application package( .exe, .deb, .dmg)
- Java Shell( jshell): Type and execute java syntax
- Launch single-file source code programs in a single step
- Example: ```java HelloWorld.java```
- Flight Recorder
- Allows monitoring of Garbage collection, JIT compilation, locks, class loading, events
- Async, non-blocking http requests
- Initialize collections with data in single line
- Example: ```Set.of( vars...);```
- Foreign functions and Memory API: Call native libraries and read native data outside java heap
- Deserialization Filtering: Can filter objects before deserializing them into classes