Java — язык простой. И после года активного использования для Вас не остаётся секретов. Совершенно случайно я обнаружил, что на stackoverfow люди решили поделиться скрытыми возможностями (Hidden Features of Java). Вышло очень занимательно, получился своеобразный рейтинг нетривиальных возможностей, который я далее запротоколирую в вольном переводе на русский.
С большим отрывом лидирует «double brace», уже обсуждавшийся ранее в статье Эффект «double brace» by zeroed. Подробное описание метода —
http://www.c2.com/cgi/wiki?DoubleBraceInitialization
несомненно это самое забавное и неочевидное из списка. Однако как уже отмечалось, метод имеет свои минусы в виде анонимного класса на каждое использование этого метода. А также невозможности использования метода equals () для подобных объектов.
ThreadLocal — http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html
Незаслуженно забытый класс, существующий ещё с версии 1.2. И ставший ещё более привлекательным, подружившись с generics. Класс позволяет имея одну переменную, иметь различное значение для каждого из потоков.
Если эта возможность ушла от вашего взгляда — тогда пример ниже отлично и без лишних слов продемострирует её. Ссылка на JLS
Выполним:
new Foo();
new Foo();
На выходе получим:
static initializer called
instance initializer called
constructor called
instance initializer called
constructor called
public class Baz<T extends Foo & Bar> {} — ссылка на JLS
Нечто малоиспользуемое, однако всё также компилируемо:
Кстати, вспоминается забавный факт о зарезервированных словах const и goto. Которые являются ключевыми, однако использовать их нельзя. Ещё метки дают забавный эффект. Код ниже отлично компилируется (отлично громко сказанно, компилятор такое без ворчания не пропустит)
И в нем можно определить конструктор, статические и не очень методы. Поподробнее в JLS. А так же у любого enum есть методы, которые возвращают все значения, а так же по строковому имени элемента возвращают объект :
public static E[] values();
public static E valueOf(String name);
finally может “съесть” любой эксепшн — jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
Победить finally может только System.exit(..)
Метод asList в java.util.Arrays значительно преобразился начиная с версии 1.5. Выражение ниже не было бы возможным без списка аргументов переменной длины, autoboxing'а и generics.
List<Integer> ints = Arrays.asList(1,2,3);</p>
Типы для параметризованных методов могут быть указаны следующим способом:
Collections.<String,Integer>emptyMap()
static import'ы при всей неоднозначности могут помочь создать эффект потрясающей локаничности.
Подробнее 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-листа будут отражены и в родительском обекте.
Значение выражения
Инициализация final переменной может быть отложено
dump всех потоков в stdout:
windows: CTRL-Break в консоле, где запущено приложение
unix: kill -3 PID
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<T extends Foo & Bar> {} — ссылка на 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<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")));
Подробнее 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-листа будут отражены и в родительском обекте.
Класс URL
Значение выражения
new URL("http://www.yahoo.com").equals(new URL("http://209.191.93.52"))— true
Инициализация 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;
}
* This source code was highlighted with Source Code Highlighter.
Thread dump
dump всех потоков в stdout:
windows: CTRL-Break в консоле, где запущено приложение
unix: kill -3 PID