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