SlideShare a Scribd company logo
Вещи в Java, о которых вы не
знали
Евгений Козлов, 17.11.2017
Вещи в Java, о которых вы
(возможно) не знали
Евгений Козлов, 17.11.2017
#1. Что выведет данный код?
System.out.println(5);
#1. Что выведет данный код?
System.out.println((Integer) 5);
#1. Что выведет данный код?
Class<?> c = Class.forName("java.lang.Integer$IntegerCache");
Field cache = c.getDeclaredField("cache");
cache.setAccessible(true);
Integer[] array = (Integer[]) cache.get(null);
array[133] = 6;
#2. Non-denotable types
#2. Non-denotable types
• Non-denotable type – это тип, который
нельзя выразить в языке Java
Union type
Union type
try {
…
} catch (IOException | SQLException e) {
…
}
Union type
interface ErrorCode {
int getErrorCode();
}
class Exception1 extends Exception
implements ErrorCode {
…
}
class Exception2 extends Exception
implements ErrorCode {
…
}
Union type
try {
…
} catch (Exception1 | Exception2 e) {
System.out.println(e.getErrorCode());
}
Intersection type
Intersection type
interface Foo {
void foo();
}
interface Bar {
void bar();
}
public <T extends Foo & Bar> void f(T t) {
t.foo();
t.bar();
}
Intersection type
Arrays.asList(1, 2, "three")
.forEach(e -> {
…
});
e : Serializable & Comparable<…>
Intersection type
List<Object> list = …
list.stream()
.map(e → (Foo & Bar) e)
.forEach(e → {
e.foo();
e.bar();
});
Anonymous class
new Object() {
int x;
int y;
}
Anonymous class
public <T> f(T t) {
return t;
}
int x =
f(new Object() { int x = 1; }).x
Anonymous class
Stream<String> stream =
Stream.of("hello", "world!");
Map<Integer, String> map = stream
.map(s → new Object() {
int key = s.length();
String value = s;
})
.collect(Collectors.toMap(
t → t.key, t → t.value));
#3. Receiver parameter
#3. Receiver parameter
class Currency {
String getName() {
…
}
}
#3. Receiver parameter
class Currency {
String getName(Currency this) {
…
}
}
#3. Receiver parameter
class Currency
implements Comparable<Currency> {
int compareTo(Currency this,
Currency that) {
…
}
}
#3. Receiver parameter
class Currency
implements Comparable<Currency> {
int compareTo(@Param Currency this,
@Param Currency that) {
…
}
}
#3. Receiver parameter
public class List<any T> {
public int sum(List<int> this) {
…
}
}
List.of(1, 2, 3).sum();
#4. Как получить имена параметров
метода через reflection?
#4. Как получить имена параметров
метода через reflection?
• Method.getParameters()
• Появилось в Java 8
• Нужна опция javac -parameters
#5. Как ускорить рефлексию?
public class Incrementor {
public static int inc(int i) {
return i + 1;
}
}
#5. Как ускорить рефлексию?
Method method = Incrementor.class
.getMethod("inc", int.class);
int result =
(int) method.invoke(null, 3);
#5. Как ускорить рефлексию?
Method method = Incrementor.class
.getMethod("inc", int.class);
MethodHandle methodHandle =
MethodHandles.lookup()
.unreflect(method);
int result = (int) methodHandle
.invokeExact(3)
#6. Финализация
public class App {
public static void main(String[] args) {
new App();
System.gc();
}
@Override
protected void finalize() throws Throwable {
System.out.println("Finalizing");
}
}
#6. Финализация
public class App {
public static void main(String[] args) {
new App();
System.gc();
}
@Override
protected void finalize() throws Throwable {
System.out.println("Finalizing");
}
}
#6. Финализация
• java.lang.ref.Cleaner
#6. Финализация
public class App {
private static final Cleaner CLEANER =
Cleaner.create();
public static void main(String[] args) {
CLEANER.register(new App(), () -> {
System.out.println("Cleaning...");
});
System.gc();
System.out.println("Program finished");
}
}
#6. Финализация
в Java 6, 7, 8
com.google.common.base.FinalizablePhantomReference<T>
и
com.google.common.base.FinalizableReferenceQueue
#7. Логирование в Java 9
#7. Логирование в Java 9
System.Logger
#8. IOException в лямбдах
List<byte[]> collect = Stream.of(
"file1.txt", "file2.txt", "file3.txt")
.map(Paths::get)
.map(path → Files.readAllBytes(path));
.collect(Collectors.toList());
#8. IOException в лямбдах
List<byte[]> collect = Stream.of(
"file1.txt", "file2.txt", "file3.txt")
.map(Paths::get)
.map(path → Files.readAllBytes(path));
.collect(Collectors.toList());
#8. IOException в лямбдах
List<byte[]> collect = Stream.of(
"file1.txt", "file2.txt", "file3.txt")
.map(Paths::get)
.map(path → {
try {
Files.readAllBytes(path));
} catch (IOException e) {
throw new UncheckedIOException(e);
}
})
.collect(Collectors.toList());

More Related Content

PDF
Statis code analysis
PPTX
C++ idioms
PDF
Анастасия Бордонос - Проектирование тестов
PPT
WTF Code @ jug.lv
PPTX
закон иерархических компенсаций седова и C++ core guidelines
PPT
Конструирование алгоритмов
PPTX
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
PPTX
Android - 02 - annotations, exceptions, io, generics
Statis code analysis
C++ idioms
Анастасия Бордонос - Проектирование тестов
WTF Code @ jug.lv
закон иерархических компенсаций седова и C++ core guidelines
Конструирование алгоритмов
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
Android - 02 - annotations, exceptions, io, generics

What's hot (20)

ODP
анализ кода: от проверки стиля до автоматического тестирования
PDF
C# Desktop. Занятие 13.
PPTX
Тест-дизайн в тестировании ПО. Задача "Треугольник"
PPT
Программирование как этап решения задач на компьютере
PPTX
Компилируемые в реальном времени DSL для С++
PDF
Дизайн больших приложений в ФП
PPTX
Android - 01 - Java Basics
PDF
Тестовый оракул: что, где, когда
PPT
паттерны программирования
PPTX
Legacy: как победить в гонке (Joker)
PDF
Автоматическая генерация тестов по комментариям к программному коду
PDF
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
PDF
Back to the future: Функциональное программирование вчера и сегодня
PDF
C# Desktop. Занятие 04.
PPTX
Golang WTF talks
PDF
C++ Базовый. Занятие 02.
PDF
Scala lecture #4
PDF
Тестирование программного обеспечения: что, зачем и почему?
PDF
C# Desktop. Занятие 02.
PPTX
обработка исключений в Java
анализ кода: от проверки стиля до автоматического тестирования
C# Desktop. Занятие 13.
Тест-дизайн в тестировании ПО. Задача "Треугольник"
Программирование как этап решения задач на компьютере
Компилируемые в реальном времени DSL для С++
Дизайн больших приложений в ФП
Android - 01 - Java Basics
Тестовый оракул: что, где, когда
паттерны программирования
Legacy: как победить в гонке (Joker)
Автоматическая генерация тестов по комментариям к программному коду
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Back to the future: Функциональное программирование вчера и сегодня
C# Desktop. Занятие 04.
Golang WTF talks
C++ Базовый. Занятие 02.
Scala lecture #4
Тестирование программного обеспечения: что, зачем и почему?
C# Desktop. Занятие 02.
обработка исключений в Java
Ad

Similar to Вещи в Java, о которых вы (возможно) не знали (20)

PPTX
Bytecode
PPT
Oop java.generics
PPT
Лекция 6
PPTX
course js day 2
PDF
[JAM 1.1] Clean Code (Paul Malikov)
PDF
Лекция 11. Тестирование.
PPTX
Поддержка Java 8 в Excelsior JET
PDF
Java осень 2014 занятие 3
PDF
Сладкое будущее: Phalcon и Zephir
PPTX
Зачем нужна Scala?
PPTX
Java весна 2013 лекция 9
PPT
Let's Talk About Junit 5
PPTX
Всё о статическом анализе кода для Java программиста
PPTX
Типичные ошибки начинающих писать тесты на WebDriver
PPTX
Тестирование программных фильтров безопасности
PDF
Zagursky
PPTX
Эффективный C++
PPTX
Оптимизация трассирования с использованием Expression templates
PPTX
Оптимизация трассирования с использованием Expression templates
PDF
Память в Java. Garbage Collector
Bytecode
Oop java.generics
Лекция 6
course js day 2
[JAM 1.1] Clean Code (Paul Malikov)
Лекция 11. Тестирование.
Поддержка Java 8 в Excelsior JET
Java осень 2014 занятие 3
Сладкое будущее: Phalcon и Zephir
Зачем нужна Scala?
Java весна 2013 лекция 9
Let's Talk About Junit 5
Всё о статическом анализе кода для Java программиста
Типичные ошибки начинающих писать тесты на WebDriver
Тестирование программных фильтров безопасности
Zagursky
Эффективный C++
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Память в Java. Garbage Collector
Ad

More from Zheka Kozlov (8)

PPTX
Модули в Java
PPTX
Java 9 модули
PDF
Введение в Scalaz
PDF
Интерпретирование языков с помощью Free-монад
PPTX
Введение в Akka
PPTX
PPTX
Сервис MobiBarC
PPTX
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
Модули в Java
Java 9 модули
Введение в Scalaz
Интерпретирование языков с помощью Free-монад
Введение в Akka
Сервис MobiBarC
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13

Вещи в Java, о которых вы (возможно) не знали