Я продолжаю переводить источник первой статьи. Всё больше очевидных вещей, не смотря на это я все же решил, что повторение — не такое плохое занятие.
И коли источник исчерпыет себя — призыв кхабра-java-сообществу : «Don’t be jealous!», дополните этот список в комментариях, поделитесь опытом. А пока — продолжение предыдущей статьи, после монтажа, дубляжа и разбавления собственным опытом:
Почти все в курсе, что в поставку JDK входит внушительное число tools’ов. Однако в повседневной работе, думаю, многие кроме как java, javac, jar не используют. Что же ещё можно взять из папки bin:
JVM может запускать код, скомпилированный в байт-код из других языков програмирования, таких как Jython, JRuby, Groovy, Scala
Начиная с Java 1.6 вы можете добавить иконку в system tray: http://java.sun.com/docs/books/tutorial/uiswing/misc/systemtray.html
Dynamic proxies добавленные в 1.3 позволяют определить во время исполнения (runtime) новый тип по заданному интерфейсу.
— Быстрое копирование массивов возможно через нативный метод System.arraycopy(...)
— Ключевое слово this позволяет получить доступ к полям и методам из внутненнего (inner) класса. Например, в случае когда внутренний класс имеет метод или поле с тем же именем: OuterClass.this.methodName() или OuterClass.this.fieldName.
* Только в случае не-статического inner класса — gribozavr
— Java 1.5 получила списки аргументов переменной длины:
— проверка на 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().
— Для 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):
мы оставляем лазейку для последующего использования первого конструктора, а именно:
И переменной hack присвоили объект анонимного класса, унаследованного от User, в добавок, вызвав конструктор User(1).
class SelfBounded<T extends SelfBounded> {
}
Из статии Брюса Эккеля www.artima.com/weblogs/viewpost.jsp?thread=136394
В нагрузку ОГРОМНЫЙ FAQ по generics – всё что вы боялись спросить: www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html
Enum могут реализовать интерфейс
По другому это назвать язык не поворачивается. Барабанная дробь…
Класс sun.misc.Unsafe позволяет реализовать прямое управление памятью в вашем приложении. Вы сможете:
Зачем это всё, хочется мне спросить? Не нахожу ответа, и, думаю, баловство с этим классом может убить 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
И коли источник исчерпыет себя — призыв к
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 позволяет реализовать прямое управление памятью в вашем приложении. Вы сможете:
- Создать объект без вызова конструктора
- Выбросить Exception без определения этого Exception в списке throws.
- Выделять, освобождать, копировать блоки памяти
- Брать и возвращать монитор объекта (lock/unlock) без объявления synchronized
Объявить класс из байт-кода— этот пункт огорчает людей, работавших с кастомным 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.