ݺߣ

ݺߣShare 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());
Ad

Recommended

Statis code analysis
Statis code analysis
chashnikov
C++ idioms
C++ idioms
COMAQA.BY
Анастасия Бордонос - Проектирование тестов
Анастасия Бордонос - Проектирование тестов
Yandex
WTF Code @ jug.lv
WTF Code @ jug.lv
Andrei Solntsev
закон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelines
COMAQA.BY
Конструирование алгоритмов
Конструирование алгоритмов
Andrey Dolinin
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
Dmitrii Dolzhenko «С++ Problems and How Test Frameworks Actually Work»
LogeekNightUkraine
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
Noveo
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
Ruslan Shevchenko
C# Desktop. Занятие 13.
C# Desktop. Занятие 13.
Igor Shkulipa
Тест-дизайн в тестировании ПО. Задача "Треугольник"
Тест-дизайн в тестировании ПО. Задача "Треугольник"
OdessaQA
Программирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютере
Andrey Dolinin
Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++
corehard_by
Дизайн больших приложений в ФП
Дизайн больших приложений в ФП
Alexander Granin
Android - 01 - Java Basics
Android - 01 - Java Basics
Noveo
Тестовый оракул: что, где, когда
Тестовый оракул: что, где, когда
Marat Akhin
паттерны программирования
паттерны программирования
guestfc8ae0
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
Victor_Cr
Автоматическая генерация тестов по комментариям к программному коду
Автоматическая генерация тестов по комментариям к программному коду
Alexey Noskov
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
ScalaNsk
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
Alexander Granin
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
Igor Shkulipa
Golang WTF talks
Golang WTF talks
Daniel Podolsky
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
Igor Shkulipa
Scala lecture #4
Scala lecture #4
Alexander Podkhalyuzin
Тестирование программного обеспечения: что, зачем и почему?
Тестирование программного обеспечения: что, зачем и почему?
Marat Akhin
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
обработка исключений в Java
обработка исключений в Java
metaform
Модули в Java
Модули в Java
Zheka Kozlov
Java 9 модули
Java 9 модули
Zheka Kozlov

More Related Content

What's hot (20)

анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
Ruslan Shevchenko
C# Desktop. Занятие 13.
C# Desktop. Занятие 13.
Igor Shkulipa
Тест-дизайн в тестировании ПО. Задача "Треугольник"
Тест-дизайн в тестировании ПО. Задача "Треугольник"
OdessaQA
Программирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютере
Andrey Dolinin
Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++
corehard_by
Дизайн больших приложений в ФП
Дизайн больших приложений в ФП
Alexander Granin
Android - 01 - Java Basics
Android - 01 - Java Basics
Noveo
Тестовый оракул: что, где, когда
Тестовый оракул: что, где, когда
Marat Akhin
паттерны программирования
паттерны программирования
guestfc8ae0
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
Victor_Cr
Автоматическая генерация тестов по комментариям к программному коду
Автоматическая генерация тестов по комментариям к программному коду
Alexey Noskov
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
ScalaNsk
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
Alexander Granin
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
Igor Shkulipa
Golang WTF talks
Golang WTF talks
Daniel Podolsky
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
Igor Shkulipa
Scala lecture #4
Scala lecture #4
Alexander Podkhalyuzin
Тестирование программного обеспечения: что, зачем и почему?
Тестирование программного обеспечения: что, зачем и почему?
Marat Akhin
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
обработка исключений в Java
обработка исключений в Java
metaform
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
Ruslan Shevchenko
C# Desktop. Занятие 13.
C# Desktop. Занятие 13.
Igor Shkulipa
Тест-дизайн в тестировании ПО. Задача "Треугольник"
Тест-дизайн в тестировании ПО. Задача "Треугольник"
OdessaQA
Программирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютере
Andrey Dolinin
Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++
corehard_by
Дизайн больших приложений в ФП
Дизайн больших приложений в ФП
Alexander Granin
Android - 01 - Java Basics
Android - 01 - Java Basics
Noveo
Тестовый оракул: что, где, когда
Тестовый оракул: что, где, когда
Marat Akhin
паттерны программирования
паттерны программирования
guestfc8ae0
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
Victor_Cr
Автоматическая генерация тестов по комментариям к программному коду
Автоматическая генерация тестов по комментариям к программному коду
Alexey Noskov
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
ScalaNsk
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
Alexander Granin
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
Igor Shkulipa
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
Igor Shkulipa
Тестирование программного обеспечения: что, зачем и почему?
Тестирование программного обеспечения: что, зачем и почему?
Marat Akhin
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
обработка исключений в Java
обработка исключений в Java
metaform

More from Zheka Kozlov (8)

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

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