Русские документы
Ежедневные компьютерные новости RSS rusdoc.ru  Найти :
Новости
Последние поступления
Книжный магазин
  Hardware:
Видеоустройства
Системные платы
Процессоры
Мобильные устройства
Аудиосистема
Охлаждение системы
Накопители информации
КПК и ноутбуки
Телефоны и связь
Периферия
Система
Сети
Разные устройства
 
  Programming:
Web-разработка
Языки программирования
Технологии и теория
Разработка игр
Программная инженерия
 
  Software:
Операционные системы
Windows 7
Базы данных
Обзоры программ
Графика и дизайн
   
  Life:
Компьютерная жизнь
Разные материалы
   
Партнеры
Публикация
Правовая информация
Реклама на сайте
Обратная связь
Экспорт в RSS Экспорт в RSS2.0
    Читать в Яндекс.Ленте



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

Раздел: Programming / Java @ 20.08.2009 | Ключевые слова: java stackoverfow ThreadLocal версия для печати

Автор: sedovmik
Источник: habrahabr

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.<String,Integer>emptyMap()

static import`ы при всей неоднозначности могут помочь создать эффект потрясающей локаничности.
List<String> 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-листа будут отражены и в родительском обекте.

Класс 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

Это интересно:








версия для печатиРаспечатать статью


Вернуться в раздел: Programming / Java


Реклама:
Читать наc на:

Add to Google
Читать в Яндекс.Ленте






Rambler's Top100
© Copyright 1998-2012 Александр Томов. All rights reserved.