SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Вещи в 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());

Weitere ähnliche Inhalte

Was ist angesagt?

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

Was ist angesagt? (20)

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

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

Oop java.generics
Oop java.genericsOop java.generics
Oop java.genericsmuqaddas_m
 
Лекция 6
Лекция 6Лекция 6
Лекция 6itc73
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)Evgeny Kaziak
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Nikita Lipsky
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirCodeFest
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9Technopark
 
Let's Talk About Junit 5
Let's Talk About Junit 5Let's Talk About Junit 5
Let's Talk About Junit 5SQALab
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverIgor Khrol
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиZestranec
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++Andrey Karpov
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 

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

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

Mehr von Zheka Kozlov

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

Mehr von Zheka Kozlov (8)

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

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