Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров17K
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<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
Теги:
Хабы:
Всего голосов 54: ↑44 и ↓10+34
Комментарии50

Публикации

Истории

Работа

Java разработчик
358 вакансий

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань