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); } Помните, что арифметические и логические операции выполняются гораздо быстрее умножения и деления. С продолжением статьи можно познакомиться здесь. |