В этой статье вы сможете открыть для себя несколько удивительных, а иногда и странных фактов, которые имеют место в Java.
Несмотря на то, что Java признан очень мощным и надежным языком, его также считают простым для изучения. После года активного написания программ на Java для вас не должно остаться секретов. Но, оказывается, этому языку всё ещё есть, чем нас удивить. Перед вами своеобразный рейтинг нетривиальных возможностей в Java.
☕ Подтянуть свои знания по Java вы можете на нашем телеграм-канале «Библиотека Java для собеса»
1. Double brace
В этом рейтинге с большим отрывом лидирует «double brace». Здесь можно найти подробное описание метода. Это самое забавное и не очевидное из списка. Однако метод имеет свои минусы в виде анонимного класса на каждое использование этого метода, а также невозможности использования метода equals() для подобных объектов.
2. ThreadLocal
ThreadLocal — незаслуженно забытый класс, существующий ещё с версии 1.2. Он стал даже более привлекательным, подружившись с generics. Класс позволяет иметь различное значение для каждого из потоков с использованием только одной переменной. Описание по ссылке.
3. Instance Initializers
Если эта возможность ушла от вашего взгляда — тогда пример ниже отлично и без лишних слов продемонстрирует её.
public class Foo { public Foo() { System.out.println("constructor called"); } static { System.out.println("static initializer called"); } { System.out.println("instance initializer called"); } }
Выполним:
new Foo(); new Foo();
На выходе получим:
static initializer called instance initializer called constructor called instance initializer called constructor called
4. Именованные блоки и метки в Java
Нечто малоиспользуемое, однако всё так же компилируемое:
twoCycle: { while (true) { while (true) { break twoCycle; } } }
Здесь также вспоминается факт о зарезервированных словах const и goto, которые являются ключевыми, однако использовать их нельзя. Ещё метки дают забавный эффект. Код ниже отлично компилируется (отлично громко сказано, компилятор такое без ворчания не пропустит).
class Example { public static void main(String[] args) { System.out.println("Hello World!"); http://Phi.Lho.free.fr System.exit(0); } }
🧩☕ Интересные задачи по Java для практики можно найти на нашем телеграм-канале «Библиотека задач по Java»
5. Enum — это класс
И в нем можно определить конструктор, статические и не очень методы. А также у любого enum есть методы, которые возвращают все значения, а по строковому имени элемента возвращают объект:
public static E[] values(); public static E valueOf(String name);
6 Finally и return
finally может “съесть” любой эксепшн. Подробнее здесь.
public static int f() { try { throw new RuntimeException(); } finally { return 0; } }
Победить finally может только System.exit(..)
7. Коллекции
Метод asList в java.util.Arrays значительно преобразился начиная с версии 1.5. Выражение ниже не было бы возможным без списка аргументов переменной длины, autoboxing'а и generics.
List<Integer> ints = Arrays.asList(1,2,3);</p>
Типы для параметризованных методов могут быть указаны следующим способом:
Collections.<String,Integer>emptyMap()
static import'ы при всей неоднозначности могут помочь создать эффект потрясающей лаконичности.
List<String> ls = List("a", "b", "c"); List<Map<String, String>> data = List(Map( o("name", "michael"), o("sex", "male")));
Подробнее по ссылке.
Кстати — List.subList(int fromIndex, int toIndex) возвращает view оригинального объекта. Это документированная, однако мало распространённая возможность. Позволяет работать с подсписком, при этом изменения sub-листа будут отражены и в родительском объекте.
8. Класс URL
Значение выражения
new URL("http://www.yahoo.com").equals(new URL("http://209.191.93.52"))
— true
9. Инициализация final переменной
Инициализация final переменной может быть отложена
public Object getElementAt(int index) { final Object element; if (index == 0) { element = "Result 1"; } else if (index == 1) { element = "Result 2"; } else { element = "Result 3"; } return element; }
Дополнительные материалы по теме:
Подборка материалов и видеокурсов по Java
Комментарии