Последнее изменение: 26 сентября 2012г.


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


Общее

В этой части собраны статьи, посвященные общим вопросам программирования.


Графический интерфейс

В этой части собраны статьи, посвященные графическомй интерфейсу, GUI – о его устройстве, особенностях работы и т.п..


java.lang

В этой части собраны статьи, связаные преимущественно с пакетом java.lang.


java.io

В этой части собраны статьи, посвященные вводу-выводу, кодировкам и пр – тому, что содержится в пакете java.io и не только в нем


Знаете ли Вы?..

Здесь собраны некоторые тонкости, о которых знают далеко не все.. Эти тонкости могут доставить много головной боли. С некоторыми из них я в свое время даже обращался в службу поддержки 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 в поток в действительности запишется только ссылка на этот объект, даже если его содержимое изменилось? Подробнее об этой ситуации и о том, как ее обходить, – в блоге: Повторная запись объектов в поток

* * *

На самом деле таких тонкостей много больше. Все я сейчас перечислять не буду, к некоторым из них крайне желательны иллюстрации, чтобы понять, в чем суть.