The Developer Times — simplicity & usability

About
В течения дня разрабатываю коммерческие Ruby on Rails, Java и C# web-приложения. Вечером исследую технологии разработки ПО, пишу заметки в блог и иногда могу забить гвоздь. :) По возможности, стараюсь делать проще и удобнее. Для Tumblr поддерживаю тему "Flashback to Simplicity". А связаться со мной можно через местный телеграф.

Самый короткий способ избавиться от дубликатов в списке в Java

Избавиться от дубликатов в списке и при этом не потерять порядок.

// Список с дубликатами
ArrayList list = new ArrayList() {{ add("A"); add("B"); add("A"); }};

// Список без дубликатов
list = new ArrayList(new LinkedHashSet(list));

Возможно эффективность страдает, зато коротко. Как вариант, можно использовать org.apache.commons.collections.list.SetUniqueList.

List uniqueList = SetUniqueList.decorate(new ArrayList());

Если в списке хранятся нестандартные объекты, будет также полезно переопределить public boolean equals(Object obj) и public int hashCode() при помощи org.apache.commons.lang3.builder.EqualsBuilder и org.apache.commons.lang3.builder.HashCodeBuilder соответственно.

| tags:

Копирование InputStream в OutputStream одной строчкой

Вы всё ещё пишете так:

// InputStream is
// OutputStream op;
byte[] buf = new byte[4096];
int len;
while ((len = is.read(buf)) != -1) {
  op.write(buf, 0, len);
}
op.flush();
is.close();

Зачем? Ведь можно писать короче и проще, используя IOUtils:

// InputStream is
// OutputStream op;
IOUtils.copy(is, os);
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
| 1 заметка | tags:

Instance initializer (double brace initialization)

Есть такая замечательная конструкция в Java — instance initializer:

User u = new User() {{
  email = "test@email.com";
  password = "password";
}};

The first brace creates a new anonymous inner class, the second declares an instance initializer block that is run when the anonymous inner class is instantiated. This type of initializer block is formally called an “instance initializer”, because it is declared within the instance scope of the class — “static initializers” are a related concept where the keyword static is placed before the brace that starts the block, and which is executed at the class level as soon as the classloader completes loading the class. The initializer block can use any methods, fields and final variables available in the containing scope, but one has to be wary of the fact that initializers are run before constructors (but not before superclass constructors).

Но,

This only works only for non-final classes because it creates an anonymous subclass.

Удобно.

(Источник: c2.com)

| tags:

Сброс кеша темы для WebSphere Portal

По работе, стояла задача изменить тему оформления для WebSphere Portal 6. Тема располагается по следующему пути: WebSpherePortal\wp_profile\installedApps\<domain>\wps.ear\wps.war\themes\html\<theme>. Какое-то время, не мог понять, почему не вижу обновлений темы на портале. После исследования проблемы выяснил — она кешируется зараза эдакая. Соответственно изменения в jspf-файлах не применяются. Перезапуск портала не помогает.

Дальнейшие изыскания помогли найти решение: если нужно, чтобы изменения применились, необходимо пересохранить файл Default.jsp, тогда timestamp файла обновиться и тема будет пересобрана.

P.S.: А вообще, WebSphere Portal — это кладезь примеров того, как не стоит делать программные продукты.

| tags:

Play Framework 2 is tasty

К концу 2011 года, разработчики Play Framework-а обещают выпустить новую вкуснейшую версию — 2.0, которая порвёт все существующие Web Framework-и.

We expect to release a usable beta towards the end of the year.

Решил скомпилировать development версию и ознакомиться с ней. Последняя заливка оказалось нерабочей, поэтому воспользовался предыдущей.

$ mkdir PlayFramework
$ cd PlayFramework
$ git clone git://github.com/playframework/Play20.git .
$ git checkout 27842af8f3dabf5acf7e1cbf5f34ddde9cd7d8ec
$ cd framework
$ ./build
> build-repository
> exit
$ cd ..
$ ./play
       _            _ 
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/ 

play! 2.0, http://www.playframework.org

This is not a play application!

Use `play new` to create a new Play application in the current directory, 
or go to an existing application and launch the development console using `play`.

You can also browse the complete documentation at http://www.playframework.org.
| 39 заметок | tags: