Нетривиальные возможности Java

FoxPro

Java — язык простой. И после года активного использования для Вас не остаётся секретов. Совершенно случайно я обнаружил, что на stackoverfow люди решили поделиться скрытыми возможностями (Hidden Features of Java). Вышло очень занимательно, получился своеобразный рейтинг нетривиальных возможностей, который я далее запротоколирую в вольном переводе на русский.

double brace

С большим отрывом лидирует «double brace», уже обсуждавшийся ранее в статье Эффект «double brace» by zeroed. Подробное описание метода —
http://www.c2.com/cgi/wiki?DoubleBraceInitialization
несомненно это самое забавное и неочевидное из списка. Однако как уже отмечалось, метод имеет свои минусы в виде анонимного класса на каждое использование этого метода. А также невозможности использования метода equals () для подобных объектов.

ThreadLocal

ThreadLocal — http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html
Незаслуженно забытый класс, существующий ещё с версии 1.2. И ставший ещё более привлекательным, подружившись с generics. Класс позволяет имея одну переменную, иметь различное значение для каждого из потоков.

Instance Initializers

Если эта возможность ушла от вашего взгляда — тогда пример ниже отлично и без лишних слов продемострирует её. Ссылка на JLS

public class Foo {
public Foo() {
System.out.println(«constructor called»);
}

static {
System.out.println(«static initializer called»);
}

{
System.out.println(«instance initializer called»);
}
}

* This source code was highlighted with Source Code Highlighter.

Выполним:
new Foo();
new Foo();

На выходе получим:
static initializer called
instance initializer called
constructor called
instance initializer called
constructor called

Пересечение множеств классов, как generic-тип

public class Baz {} — ссылка на JLS

Именованные блоки и метки

Нечто малоиспользуемое, однако всё также компилируемо:
twoCycle:
{
while (true) {
while (true) {
break twoCycle;
}
}

}

* This source code was highlighted with Source Code Highlighter.

Кстати, вспоминается забавный факт о зарезервированных словах const и goto. Которые являются ключевыми, однако использовать их нельзя. Ещё метки дают забавный эффект. Код ниже отлично компилируется (отлично громко сказанно, компилятор такое без ворчания не пропустит)
class Example {
public static void main(String[] args) {
System.out.println(«Hello World!»);
http://Phi.Lho.free.fr

System.exit(0);
}
}

* This source code was highlighted with Source Code Highlighter.

Enum — это класс

И в нем можно определить конструктор, статические и не очень методы. Поподробнее в JLS. А так же у любого enum есть методы, которые возвращают все значения, а так же по строковому имени элемента возвращают объект :

public static E[] values();
public static E valueOf(String name);

finally и return

finally может “съесть” любой эксепшн — jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
public static int f() {
try {
throw new RuntimeException();
} finally {
return 0;
}
}

* This source code was highlighted with Source Code Highlighter.

Победить finally может только System.exit(..)

Коллекции

Метод asList в java.util.Arrays значительно преобразился начиная с версии 1.5. Выражение ниже не было бы возможным без списка аргументов переменной длины, autoboxing`а и generics.
List ints = Arrays.asList(1,2,3);

Типы для параметризованных методов могут быть указаны следующим способом:
Collections.emptyMap()

static import`ы при всей неоднозначности могут помочь создать эффект потрясающей локаничности.
List ls = List(«a», «b», «c»);
ListString, String>> data = List(Map( o(«name», «michael»), o(«sex», «male»)));

Подробнее gleichmann.wordpress.com/2008/01/13/building-your-own-literals-in-java-lists-and-arrays/ и code.google.com/p/google-collections/
Для фанатов jquery – использование знака $: garbagecollected.org/2008/04/06/dollarmaps/

И на последок ещё один подпунктик — List.subList(int fromIndex, int toIndex) возвращает view оригинального объекта.
Документированная, однако мало распространённая возможность. Позволяет работать с подсписком, при том изменения sub-листа будут отражены и в родительском обекте.