Java 9

 

какво ново и как да се подготвим

Александър Куртаков

За мен

  • Линукс разработчик, работещ целодневно по Eclipse IDE
  • Eclipse SWT, Platform UI, CDT, Linux Tools, DLTK, CBI ...
  • Технически ръководител на Ред Хат "Desktop Eclipse IDE" екип
  • Федора Java SIG организатор

Java 9

Кратка История

  • Първоначално (2011 г.) планиран за 2016 г.

Java 9

Кратка История

  • Първоначално (2011 г.) планиран за 2016 г.
  • Началото на 2016 отложен за Март 2017 г.

Java 9

Кратка История

  • Първоначално (2011 г.) планиран за 2016 г.
  • Началото на 2016 отложен за Март 2017 г.
  • Октомври 2016 отложен за Юли 2017 г.

Java 9

Кратка История

  • Първоначално (2011 г.) планиран за 2016 г.
  • Началото на 2016 отложен за Март 2017 г.
  • Октомври 2016 отложен за Юли 2017 г.
  • 27.7.2017 (http://www.java9countdown.xyz/)

НОВОСТИ В Java 9

JShell КОНЗОЛА

REPL (Read-Eval-Print-Loop)

 

НОВОСТИ В Java Езика

  • Private interface methods

 

package java9;

public interface ISmth {
	
	default void defaultMethod() {
		privateTest();
	}

	private void privateTest() {
		System.out.println("Hello from private interface method");
	}

}

НОВОСТИ В Java Езика

  • Try-With-Resources on Effectively Final Variables

 

private static void printReader(BufferedReader reader) throws IOException {
    try (BufferedReader reader1 = reader) {
	String line = null;
	while ((line = reader.readLine()) != null) {
	    System.out.println(line);
	}
    }
}
private static void printReader(BufferedReader reader) throws IOException {
    try (reader) {
	String line = null;
	while ((line = reader.readLine()) != null) {
	    System.out.println(line);
	}
    }
}

Java 8

Java 9

НОВОСТИ В Java Езика

  • Diamond Operator for Anonymous Classes

  • "_" illegal identifier name

  • SafeVarargs on Private Methods

  • JEP 213: Milling Project Coin (http://openjdk.java.net/jeps/213 )

НОВ API

Системни процеси

ProcessHandle procHandle = ProcessHandle.current();
ProcessHandle.Info procInfo = procHandle.info();

System.out.println("PID: " + procHandle.getPid());

System.out.print("Start Parameters: ");
for (String arg : procInfo.arguments().get()) {
    System.out.print(arg + " ");
}
System.out.println();
System.out.println("Path: " + procInfo.command().orElse("-"));
System.out.println("Start: " + procInfo.startInstant().get());
System.out.println("Runtime: " + procInfo.totalCpuDuration().get().toMillis() + "ms");
System.out.println("User: " + procInfo.user().get());

НОВ API

Immutable Collections Factories

List<String> list = List.of("a", "b", "c");

Set<String> set = Set.of("a", "b", "c");

Map<String, String> map = Map.of("1", "a", "2", "b", "3", "c");

НОВ API

InputStream

// Всички байтове наведнъж
byte[] result = new ByteArrayInputStream(buf).readAllBytes();

// Директен трансфер от вход към изход
new ByteArrayInputStream(buf).transferTo(System.out);

НОВ API

Графичен Интерфейс

  • MultiResolutionImage и HiDPI поддръжка
  • GTK3 поддръжка
  • Десктоп функции
  • и други

Улеснения

  • Много версиини JAR файлове
  • UTF-8 properties файлове
  • javac --release 8
  • и други

@Deprecated

(forRemoval=true)

JAVA модули

 

или

 

Jigsaw

JAVA Модули

  • Java 7 ... 8 ... 9

JAVA Модули

  • Java 7 ... 8 ... 9
  • Jar файл със module-info.class
META-INF/
META-INF/MANIFEST.MF
module-info.class
org/
org/my/
org/my/module1/
org/my/module1/ModuleA.class

JAVA Модули

  • Java 7 ... 8 ... 9
  • Jar файл със module-info.class
  • JMod файл

 

jmod describe java.activation.jmod 

java.activation@9-ea
  requires mandated java.base
  requires transitive java.datatransfer
  requires java.logging
  exports javax.activation
  contains com.sun.activation.registries
  operating-system-name Linux
  operating-system-architecture amd64
  operating-system-version 2.6

JAVA Модули

  • Java 7 ... 8 ... 9
  • Jar файл със module-info.class
  • JMod файл
  • module-path

 

JAVA Модули vs. OSGI

Java модули OSGi
Изолация промяна на public семантика ClassLoader
Експортиране пакет пакет
Импортиране модул пакет, модул(bundle)
Сървиси ServiceLoader OSGi DS

Възможни проблеми

JDK internals

  • sun.*
  • com.sun.*

Възможни проблеми

Unresolvable APIs

  • java.activation
  • java.annotations.common
  • java.corba [deprecated]
  • java.transaction
  • java.xml.bind
  • java.xml.ws

Възможни проблеми

Премахнати APIs

 

  • java.awt.peer и java.awt.dnd.peer
  • Packer/Unpacker.addPropertyChangeListener/removePropertyChangeListener
  • LogManager.addPropertyChangeListener/removePropertyChangeListener

Възможни проблеми

Няма ги rt.jar/tools.jar

Възможни проблеми

Reflection

Възможни проблеми

Javac -target/source не поддържа <6

Възможни проблеми

Използване на "_" за идентификатор

Възможни проблеми

Garbage collection опции

ПодГотовка

JDeps

  • самостоятелна програма
  • Maven plugin - maven-jdeps-plugin
  • -jdkinternals
  • -dotfile

ПодГотовка

Автоматични тестове

 

  • стартиране под Java 9
  • поправки до изпълнение без грешка!
    • reflection
    • Java version string
    • rt.jar/tools.jar

ПодГотовка

Компилиране

  • Toolchain
  • IDE
  • CI

ПодГотовка

Създаване на модули

(jdeps --generate-module-info)

module moduleA {
	exports org.my.module1;
        requires module1;
}

ПодГотовка

Classpath -> Modulepath

Q & A