Последнее изменение: 26 сентября 2012г.
Этот раздел содержит материалы, посвященные преимущественно технике программирования. Они ориентированы в основном на начинающих разработчиков, но могут быть весьма полезны и профессионалам.
Общее
В этой части собраны статьи, посвященные общим вопросам программирования.
- 23.05.11. Ликбез – то, что обязаны знать все, но большая часть не знает, а небольшая – отказывается знать.
- 01.09.07. Массивы в Java – особенности устройства массивов с примерами и картинками.
- 01.09.07. Объекты и ссылки – что надо знать о ссылках в Java.
- 13.07.10. Реализация шаблона Singleton – варианты реализации в различных ситуациях.
- 22.09.07. Четыре важных "p" – о модификаторах доступа.
- 30.09.07. Overloading, overriding и другие звери – о различных технических аспектах, появляющихся при наследовании и не только.
-
28.10.07.
try
/catch
/finally
и исключения – об исключениях как явлении, их классификации, способе обработки и обо всем, что с этим связано.
Графический интерфейс
В этой части собраны статьи, посвященные графическомй интерфейсу, GUI – о его устройстве, особенностях работы и т.п..
- 06.10.10. О менеджерах раскладки – что это такое, как и когда ими пользоваться, а также – как написать собственный.
- 25.08.10. Синхронизация пользовательского интерфейса – о том, как не допустить зависаний интерфейса при выполнении долгих задач.
- 23.12.10. Внутреннее устройство GUI – о том, как устроен пользовательский интерфейс, как рисуются компоненты и почему не получается просто рисовать на панели.
java.lang
В этой части собраны статьи, связаные преимущественно с пакетом java.lang
.
- 17.09.10. Сравнение объектов: теория – как сравниваются объекты в Java и где лежат грабли.
- 01.09.07. Сравнение объектов: практика – тонкости реализации сравнения объектов.
- 07.05.08. Ах, эти строки... – статья о строках. Расставляем флажки над зарытыми граблями.
- 28.07.11. Синхронизация потоков – о многопоточной работе и синхронизации. О кочках, буреломе и тропинках на пути к реализации многопоточности.
java.io
В этой части собраны статьи, посвященные вводу-выводу, кодировкам и пр – тому, что содержится в
пакете java.io
и не только в нем
- 19.04.11. Сериализация как она есть – особенности, тонкие места, подводные камни и способы их обхода.
- 01.09.07. Вавилонское столпотворение. Часть 1. Кодировки – статья о кодировках, их использовании и т.п.
- 01.09.07. Вавилонское столпотворение. Часть 2. Локализация и ресурсы – статья о принципах создания многоязычных приложений.
- 01.09.07. Вавилонское столпотворение. Часть 3. Веб-приложения – как отослать на сервер текст и получить его назад в неизменном виде.
- 29.10.10. Вавилонское столпотворение. Часть 4. Проза жизни: компиляция и вывод в консоль – как правильно скомпилировать исходный код и вывести в консоль текст, отличный от «Hello, World!»
Знаете ли Вы?..
Здесь собраны некоторые тонкости, о которых знают далеко не все.. Эти тонкости могут доставить много головной боли. С некоторыми из них я в свое время даже обращался в службу поддержки Sun, т.к. считал, что это ошибки.
Итак, знаете ли Вы, что ...
- ... если клонировать объект, то все ссылки на другие объекты, которые он содержит, останутся теми же самыми? Иначе говоря, инкапсулированные объекты не клонируются.
- ...
у примитивного типа (
int
,double
,boolean
и пр.) тоже есть класс? Его можно получить двумя способами: через.class
, как и для обычного класса (т.е.,int.class
), либо через класс-оболочку примитивного типа (т.е.Integer.TYPE
дляint
,Boolean.TYPE
дляboolean
и т.п.) - ... теоретически строку можно изменить? Если поставить это просто как самоцель, то reflection позволяет это сделать. Хотя в реальных условиях скорее всего этого не даст сделать менеджер безопасности. Разве что он специально неправильно настроен. Читайте в статье Ах, эти строки... – Изменение строки.
- ...
операции a += b и a = a + b совсем не эквивалентны? Сравните их, при условии,
что
a
имеет типint
, а b –float
. Первая из операций пройдет нормально, на второй компилятор выдаст синтаксическую ошибку. - ...
0.3f
+0.4f
вовсе не равно0.7f
? Проверьте это. И заодно сразу запомните – ниfloat
, ниdouble
не пригодны для точных рассчетов. Для них нужно использовать классjava.math.BigDecimal
. Читайте статью "Сравнение объектов: Практика", часть "Сравнение вещественных примитивов". - ...
существуют
+0.0
и-0.0
? Операция сравнения для них даетtrue
, хотя формально это два разных числа. И иногда их правильно считать разными. Подробности – в статье "Сравнение объектов: Практика", часть "+0.0
и-0.0
". - ...
при создании массива объектов его элементы не создаются? Под ссылки на них всего лишь выделяется
место, но элементы массива (собственно, ссылки на объекты) при этом равны
null
! Подробнее об этом – в статье "Массивы в Java". - ...
существует более одного способа сделать объект сериализуемым? Кроме интерфейса
java.io.Serializable
существует еще иjava.io.Externalizable
. Его реализация требует больше усилий, но способна дать существенный выигрыш в скорости, в некоторых случаях более чем на порядок! Читайте статью "Сериализация как она есть". - ...
существующие в J2SDK реализации
java.util.SortedSet
иjava.util.SortedMap
полагаются на то, что еслиcompareTo()
возвращает 0, то объекты равны?equals
при этом даже не вызывается! И если при реализации интерфейсаjava.lang.Comparable
не реализовать соответствующий ему (consistent) методequals
(и, разумеется,hashCode
), это может привести к трудно диагностируемым ошибкам. Читайте об этом тут: "Сравнение объектов: теория – Упорядоченные коллекции –java.util.SortedSet
иjava.util.SortedMap
". - ...
при использовании
java.net.HttpURLConnection
запрос на сервер отправляется только тогда, когда вы запрашиваетеInputStream
для чтения ответа или же какие-либо параметры ответа – response code, response message и т.п. Т.е. даже если вы вызываетеconnect()
и пишете данные в выходной поток (например, при посылке POST-запроса), запрос на сервер в этот момент не посылается. - ...
при повторной записи одного и того же объекта в
ObjectOutputStream
в поток в действительности запишется только ссылка на этот объект, даже если его содержимое изменилось? Подробнее об этой ситуации и о том, как ее обходить, – в блоге: Повторная запись объектов в поток
* * *
На самом деле таких тонкостей много больше. Все я сейчас перечислять не буду, к некоторым из них крайне желательны иллюстрации, чтобы понять, в чем суть.