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

. Posted in Fox populi - 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-листа будут отражены и в родительском обекте.

 

Добавить комментарий


Защитный код
Обновить

Команды

Релиз Firefox 8, Thunderbird 8 и сопутствующих проектов Mozilla
Проект Mozilla официально представил релиз web-браузера Firefox 8.0, первый выпуск в рамках нового сокращенного цикла разработки, которому будет присвоен статус релиза с пр...14-11-2011

Хороший ход

События объекта Database Container
События объекта Database Container (DBC) предоставляют связь между событиями, написанными разработчиком, и активностью базы данных во время работы пользователя, такой как от...14-11-2011

Руководства

О правилах хорошего тона программирования на Лисе
1. Рекомендуется использовать на каждой рабочей станции копию Лисы. 2. Для ускорения необходимо разделить общедоступные базы и библиотеки. 3. Разделить функции для к...12-11-2011