Афоризм
Не слушай внутренний свой голос; он тут снаружи не бывал.
Последние статьи

 • Активности Android
Многоэкранные Android приложения
 • Fragment dynamic
Динамическая загрузка фрагментов в Android
 • Fragment lifecycle
Жизненный цикл Fragment'ов в Android
 • Fragment example
Пример Fragment'ов в Android
 • Data Binding
Описание и пример Data Binding
 • Пример MVVM
Пример использования MVVM в Android
 • Компонент TreeTable
Описание компонента TreeTable для Swing
 • Пример TreeTable
Пример использования TreeTable
 • Хранилища Android
Внутренние и внешние хранилища данных
 • Пример SQLite
Пример использования SQLite в Android
 • WebSocket
Описание и пример реализации WebSocket
 • Визуальные компоненты
Улучшен компонент выбора даты из календаря
 • Анимация jQuery
Описание и примеры анимации элементов DOM
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
 • Yandex.Деньги
  410013796724260

 • Webmoney
  R335386147728
  Z369087728698

Советы программирования : валидация даты, конкатенация строк, проверка нечетности

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

Валидность текстовой даты

При программировании часто приходится сталкиваться с текстовым описание даты. Следующий класс позволяет решить вопросы валидации и конвертации текстового описания даты в объект java.util.Date :

Листинг
import java.util.Date;
import java.util.List;
import java.util.ArrayList;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class DateUtil
{
    /* 
     * Список возможных форматов даты
     */
    private static List<SimpleDateFormat>
           dateFormats = new ArrayList<SimpleDateFormat>(){
       {
        add(new SimpleDateFormat("dd.mm.yyyy"));
        add(new SimpleDateFormat("dd-mm-yyyy"));
        add(new SimpleDateFormat("yyyy.mm.dd"));
        add(new SimpleDateFormat("yyyy-mm-dd"));
        add(new SimpleDateFormat("M/dd/yyyy"));
        add(new SimpleDateFormat("dd.M.yyyy"));
        add(new SimpleDateFormat("dd.mm.yyyy HH:mm:ss"));
        add(new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"));
        add(new SimpleDateFormat("M/dd/yyyy hh:mm:ss a"));
       }
    };

    /**
     * Метод преобразования строковой даты в java.util.Date
     * @param input строковое описание даты
     * @return 
     *     - java.util.Date, если формат текстового описания
     *                       даты правильный;
     *     - null в противном случе
     */
    public static Date stringToDate(String input)
    {
        if(input == null)
            return null;

        Date date = null;
        for (SimpleDateFormat format : dateFormats) {
            try {
                format.setLenient(false);
                date = format.parse(input);
            } catch (ParseException e) { }
            if (date != null) {
                break;
            }
        }

        return date;
    }
}

Представленный класс хранит набор различных объектов типа SimpleDateFormat. При необходимости Вы можете добавить собственный объект описания даты. Метод stringToDate в цикле перебирает все форматы из набора и подбирает нужный. Если формат описания найден, то метод возвращает объект даты; в противном случае нулевое значение (null).

Конкатенация строк и символов

При конкатенации строк в java-приложении с помощью оператора '+' создается новый объект String. Если данную операцию выполнять в цикле for, то это может привести к существенной потере памяти и снижению производительности. Ниже представлен пример медленного и быстрого выполнения конкатенации строк. Помните, что каждый оператор + будет резервировать память в "куче", как отдельный объект String.

Листинг

// медленное выполнение
String[] fields = new String[] {"ab","bc","cd","de","ef"};
String s = "";
for (int i = 0; i < fields.length; i++) {
    s = s + fields[i];
}
return s;
//---------------------------------------------------------
// быстрое выполнение
String[] fields = new String[] {"ab","bc","cd","de","ef"};
StringBuilder s = new StringBuilder();
for (int i = 0; i < fields.length; i++) {
    s.append(fields[i]);
}
return s.toString();
 

Старайтесь ипользовать StringBuilder, а не StringBuffer. Это связано с тем, что StringBuilder, в отличие от StringBuffer, не включает синхронизированных методов, и, следовательно, производительность, хоть и незначительно, но будет выше.

Также следует избегать создания строки с помощью конструктора класса String :


// медленное инициирование
String bad = new String("Текстовая строка");

// быстрое инициирование
String good = "Текстовая строка";
 

Помните, что конкатенация строк и символов отличается. При конкатенации символов значения преобразуются к целочисленным значениям через расширение примитивных типов. Так, в следующем примере в консоль приложения будет выведено не значение "АБаб", а "АБ2145", поскольку символьные значения 'а' = \u0430 = 1072 и 'б' = \u0431 = 1073 составляют в сумме 2145.


public class CharConcat
{
    public static void main(String[] args) {
        System.out.print("А" + "Б");
        System.out.print('а' + 'б');
    }
}
 

Проверка нечетности числа

Для определения остатка от деления двух чисел используется операнд '%', при помощи которого можно также определить четность/нечетность значения. Приведенный ниже метод checkOdd выполняет проверку нечетности числа :

public class TestOdd 
{
    public static boolean checkOdd(int num)
    {
        return ((num % 2) == 1);
    }

    public static void main(String[] args) {
        System.out.println(checkOdd(-5));
    }
}

К сожалению, для отрицательных нечетных значений данный метод работать не будет (к примеру, -5 % 2 = -1). Но, если вместо операнда '%' использовать амперсанд '&', то метод "выстрелит" правильно; к тому же код будет более продуктивным.

public static boolean checkOdd(int num)
{
    return ((num & 1) != 0);
}

Помните, что арифметические и логические операции выполняются гораздо быстрее умножения и деления.

С продолжением статьи можно познакомиться здесь.

  Рейтинг@Mail.ru