вторник, 19 апреля 2011 г.

Массив в коллекцию, пожалуйста. И чтобы покороче

Особенности Arrays.asList(T... elements)
Arrays.asList(T... elements) и Collection.toArray() являются стандартным (так говорят javadoc'и) мостом между библиотеками, работающими с массивами и коллекциями. Звучит красиво, что уж там.
Немногие дочитывают до того места, в котором говорится, что полученный List является fixed-size. А это означает, например, что оттуда нельзя удалить элемент. Этот баг можно быстро найти и понять, но тем не менее. В общем, я был неприятно удивлён. Что побудило Sun реализовать метод именно так я не смог понять (поэтому мне сложно решить, пометить запись меткой "фича" или "кривота"...выберу обе).
Как лечится?
Например, так:
List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3));

понедельник, 11 апреля 2011 г.

Переименовать таблицу или колонку

Парочка мелких вещей в SQL, которые меня слегка удивили.
  • В БД при изменении имени таблиц все constraints автоматически подстраиваются под это изменение. То есть никаких ошибок не возникнет (входит в стандарт и работает на абсолютном большинстве БД).
    ALTER TABLE MyTable RENAME TO MY_TABLE;
    
  • Но Oracle пошёл и того дальше. Он умеет даже переименовывать колонки. При этом даже если это Primary Key. Даже если на колонку навешены другие индексы, даже если на неё ссылается Foreign Key из другой таблицы. К сожалению, эта фишка не из стандарта, поэтому в других БД может и не быть (в MySQL нет, например).
    ALTER TABLE MyTable RENAME COLUMN id TO identifier;
    

воскресенье, 3 апреля 2011 г.

Асимметрия

Вопрос:
Может ли функция Math.abs(int) вернуть отрицательное число?

Ответ:
Как же хочется написать "нет", улыбнуться и подумать, что я всех обманул таким вопросом. На самом деле может. Так уж повелось, что отрицательных чисел больше, чем положительных. Так уж повелось, что если byte, то диапазон -128..127, ну и так далее с увеличением количества байт на хранение. К чему это приводит?
int minValue = Integer.MIN_VALUE;
int abs = Math.abs(minValue);
System.out.println(abs);
Закрываем, трясём, смотрим (©):
> -2147483648