background preloader

Java

Facebook Twitter

Русскоязычная спецификация языка Java. Столкнулся я с необходимостью перевода материала, касающегося языка Java.

Русскоязычная спецификация языка Java

Причем, перевод должен быть сделан не для себя, а так сказать, для общего пользования. Поэтому, он должен быть максимально приближен к оригиналу и выполнен в соответствии с требованиями спецификации языка. Как оказалось, эти два требования не всегда означают одно и то же. Ну, во-первых, сам оригинал позволяет себе довольно вольное обращение с терминами, «но это так мелочь», а во вторых, в который раз пришлось столкнуться с разночтениями в русской трактовке Java-язычных терминов.

А это, на мой взгляд, уже довольно большая и давно существующая проблема. Начнем с того, что в языке Java существуют такие термины как operator, operation, operand и statement. Следующим устоявшимся штампом является применения термина «оператор» в качестве перевода понятия statement. С точки зрения спецификации: «Statements are roughly equivalent to sentences in natural languages. . Соответствующей значению 1 переменной choice.

Autoboxing и unboxing в Java. Сегодня речь пойдет об автоупаковке (autoboxing) и распаковке (unboxing).

Autoboxing и unboxing в Java

Это одно из существенных изменений, внесенных в JDK 5. Теперь разработчики могут писать более чистый код, но непонимание работы этого механизма может привести к плохой производительности. Автоупаковка Это автоматическая инкапсуляция примитивного типа в эквивалентную ему класс-обёртку всякий раз, когда требуется объект данного типа. Про инкапсуляцию и другие принципы ООП существует замечательная статья от ffriend. Autoboxing происходит: При присвоении значения примитивного типа переменной соответствующего класса-обёртки.При передаче примитивного типа в параметр метода, ожидающего соответствующий ему класс-обёртку. Примеры До JDK 5 public class Main { public static void main(String[] args) { Integer iOb = new Integer(7); Double dOb = new Double(7.0); Character cOb = new Character('a'); Boolean bOb = new Boolean(true); method(new Integer(7)); } public static void method(Integer iOb) { System.out.println("Integer"); } }

Precise timestamp. Пока идёт горячее обсуждение быть или нет быть jigsaw в java 9 и в каком виде ему быть — не стоит забывать про полезняшки, которые несёт с собой девятка — и одна из них — повышение точности Clock.systemUTC() — JDK-8068730.

Precise timestamp

Что же было раньше ? До java 8 был System.currentTimeMillis() и System.nanoTime(), и если первый давал wall clock время, но с миллисекундным разрешением, то второй даёт время с разрешением до наносекунд, но область применения ограничена измерением разности времён, причём в рамках одной jvm — и ни о каком использовании такой временной метки между разными машинами и быть не может. Поэтому часто велосипедят свои precise timestamp дающие wall clock время с большим разрешением, чем у currentTimeMillis (используя jni со всеми вытекающими) — более подробно про разницу между currentTimeMillis и nanoTime, и про велосипед можно почитать в моём старом посте. Java 8 заложил очень мощный фундамент — Java Time API. Java 8 даст примерно такие результаты И Java 9: Но как же перформанс ? Как это работает в мире java. Пул потоков. Class'ные Class'ы. Вводная Наверное, java-классы — это самая известная ее часть.

Class'ные Class'ы

Мы их используем каждый день, пишем их, правим их. Но есть много нюансов, о которых мы даже не догадываемся. И я люблю за это 'нашу' java — она всегда сможет оставаться загадочной, таинственной. Компиляция Java программ и разрешение зависимостей в runtime. Как можно совместить некоторые достоинства динамических языков со строгой типизацией в обычном Java коде?

Компиляция Java программ и разрешение зависимостей в runtime

Самое интересное на хабре, обычно происходит в комментариях к статье. Вот и в этот раз в комментариях к «Модуляризация в JavaSE без OSGI и Jigsaw» началось обсуждение что работа через reflection в java перечеркивает многие плюсы библиотеки mvn-classloader. В Groovy же с этой библиотекой работать просто и удобно: def hawtIoConsole = MavenClassLoader.usingCentralRepo().forMavenCoordinates('io.hawt:hawtio-app:2.0.0').loadClass('io.hawt.app.App') Thread.currentThread().setContextClassLoader(hawtIoConsole.getClassLoader()) hawtIoConsole.main('--port','10090') Попробуем это исправить с помощью java-as-script.jar, исходный код проекта доступен на github.

Динамическая компиляция Стандарт JSR 199 — java Compiler API, существует довольно давно. Хотелось бы что-нибудь готовое, не велосипедить каждый раз и коллега подсказал проект Janino. Динамическое разрешение зависимостей.

Reflection

Generics. _ТЕМЫ. Разное. Источники. Java память. Ресурсы. Онлайн-компиляторы. Concurency. GC. Collections. Lambda.