Pull to refresh

Другие возможности Java

Reading time 4 min
Views 6.8K
Я продолжаю переводить источник первой статьи. Всё больше очевидных вещей, не смотря на это я все же решил, что повторение — не такое плохое занятие.

И коли источник исчерпыет себя — призыв к хабра-java-сообществу: «Don’t be jealous!», дополните этот список в комментариях, поделитесь опытом. А пока — продолжение предыдущей статьи, после монтажа, дубляжа и разбавления собственным опытом:

JDK tools


Почти все в курсе, что в поставку JDK входит внушительное число tools’ов. Однако в повседневной работе, думаю, многие кроме как java, javac, jar не используют. Что же ещё можно взять из папки bin:

  • jstack — позволяет сделать thread dump для любого приложения java по его PID.
  • jvisualvm — новая (1.6_07+) графическая оболочка для мониторинга, профайлинга.
  • javap — декомпилятор дизассемблер, в том числе может показать jvm инструкции.
  • Остальное: java.sun.com/javase/6/docs/technotes/tools

Java VM


JVM может запускать код, скомпилированный в байт-код из других языков програмирования, таких как Jython, JRuby, Groovy, Scala

System Tray


Начиная с Java 1.6 вы можете добавить иконку в system tray: http://java.sun.com/docs/books/tutorial/uiswing/misc/systemtray.html

Dynamic proxies


Dynamic proxies добавленные в 1.3 позволяют определить во время исполнения (runtime) новый тип по заданному интерфейсу.

Знаете ли Вы, что:



  —  Быстрое копирование массивов возможно через нативный метод System.arraycopy(...)

  —  Ключевое слово this позволяет получить доступ к полям и методам из внутненнего (inner) класса. Например, в случае когда внутренний класс имеет метод или поле с тем же именем: OuterClass.this.methodName() или OuterClass.this.fieldName.
* Только в случае не-статического inner класса — gribozavr

  —  Java 1.5 получила списки аргументов переменной длины:
public void foo(String... bars) {
  for (String bar: bars)
   System.out.println(bar);
}


  —  проверка на null перед instanceof необъязательна:
if (null != aObject && aObject instanceof String) {
тоже самое что и
if (aObject instanceof String)

  —  Существует магическая сериализация Serializable, но не Externalizable объекта через private методы writeObject, readObject
java.sun.com/developer/technicalArticles/Programming/serialization

  —  Классы для примитивов можно получить, используя int.class, float.class…

  —  Класс String — единственный тип, помимо примитивов, для которого работают + и +=. При этом конструкция str = str + «1» заменяется компилятором на str = new StringBuffer(str).append(«1»).toString(). Вы все ещё конкатенируете строки в цикле?
* Начиная с Java 1.5 используется StringBuilder — malkolm

  —  C-style sprintf возможен в java, попробуйте String.format().
String w = «world»;
String s = String.format(«Hello %s %d», w, 3);


  —  Для float i = Float.NaN – выражение i == i равно false
* Это требование IEEE 754. Проверить double на NaN можно при помощи Double.isNan() — gribozavr

Полузакрытые конструкторы



Источник: javaekspert.blogspot.com/2007/11/semi-private-constructors.html

Очень часто возникает необходимость сделать создание объекта недоступным для других классов (например, при использовании фабрик) или закрыть доступ к части конструкторов, объявив их «частной собственностью» объекта. Однако приходится наступать на собственные же грабли во время модульного тестирования – невозможно создать объект.

На помощь приходят полузакрытые конструкторы, использование protected конструкторов и анонимных классов. Пример:
Если класс User хочет скрыть один из своих конструкторов User(int id), оставив доступным только User(String name) – это его право. Однако, объявив класс следующим образом (именно protected, а не private):

public class User { // важно что User не final
  protected User(int id) {…}
  public User(String name) {
    this(getId(name));
  }
}


мы оставляем лазейку для последующего использования первого конструктора, а именно:

public class TestUser {  
  public void testUserIdConstructor() {    
    User hack = new User(1) {};  
  }
}


И переменной hack присвоили объект анонимного класса, унаследованного от User, в добавок, вызвав конструктор User(1).

Self-bound generics



class SelfBounded<T extends SelfBounded> {
}

Из статии Брюса Эккеля www.artima.com/weblogs/viewpost.jsp?thread=136394
В нагрузку ОГРОМНЫЙ FAQ по generics – всё что вы боялись спросить: www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html

И снова про enum



Enum могут реализовать интерфейс

public interface Room {
  public Room north();
  public Room south();
  public Room east();
  public Room west();
}

public enum Rooms implements Room {
  FIRST {
    public Room north() {
      return SECOND;
    }
  },
  SECOND {
    public Room south() {
      return FIRST;
    }
  }

  public Room north() { return null; }
  public Room south() { return null; }
  public Room east() { return null; }
  public Room west() { return null; }
}


Черная магия


По другому это назвать язык не поворачивается. Барабанная дробь…
Класс sun.misc.Unsafe позволяет реализовать прямое управление памятью в вашем приложении. Вы сможете:
  1. Создать объект без вызова конструктора
  2. Выбросить Exception без определения этого Exception в списке throws.
  3. Выделять, освобождать, копировать блоки памяти
  4. Брать и возвращать монитор объекта (lock/unlock) без объявления synchronized
  5. Объявить класс из байт-кода — этот пункт огорчает людей, работавших с кастомным ClassLoader'ом

Зачем это всё, хочется мне спросить? Не нахожу ответа, и, думаю, баловство с этим классом может убить JVM

Источник —
http://www.docjar.com/html/api/ClassLib/Common/sun/misc/Unsafe.java.html
и ещё одна занимательная ссылка, уже на русском —
http://wasm.ru/article.php?article=unsjav1
http://wasm.ru/article.php?article=unsafe_ii
использование в open source:
google code search

* Source code was highlighted with Source Code Highlighter.
Tags:
Hubs:
+42
Comments 25
Comments Comments 25

Articles