Поиск по этому блогу

понедельник, 26 мая 2014 г.

Шаблоны проектирования. Singleton (Одиночка)

Шаблон проектирования Singleton в переводе на русский Одиночка. Наверное,  один самых распространенных шаблонов проектирования.  Не очень сложен для понимания и для реализации. Существует несколько способов реализации этого шаблона.




// Самый простой вариант - без синхронизации,
// не работает в многопоточных приложениях
public class MySingleton {
  private static MySingleton instance;
 
  private MySingleton() {
  }
 
  public static MySingleton getInstance() {
    if (instance == null) {
      instance = new MySingleton();
    }
    return instance;
  }
}

Как сделать

1. Создаем сам Java-класс
2. Создаем private конструктор этого класса
3. Создаем private static переменную класса. Тип этой переменной сам класс.
4. Создаем public метод, который будет проверять на null нашу статическую приватную переменную  и возвращать ее.

Таким образом, в любой момент времени мы сможем получить только один экземпляр нашего класса. 

Достоинства петтерна Singleton

Единственный экземпляр класса и контролируемый к нему доступ.

Недостатки паттерна Singleton

Глобальные объекты могут плохо сочитаться с объектным программированием (плохая масштабируемость)

GWT. How to create and use custom widget

Как в GWT создать собственный виджет и использовать его после этого как при помощи Java кода так и при помощи uiBinder. Прежде всего создадим два файла - java класс для нашего виджета и xml-файл, в котором опишем структуру нашего виджета.

ModalDialogWidget.java
ModalDialogWidget.ui.xml

Наш виджет будет наследоваться от класса Composite.
public class ModalDialogWidget extends Composite

Внутри нашего виджета создадим интерфейс, который будет расширять UiBinder. После этого создадим статическую переменную типа созданного интерфейса (переменная uiBinder). Она нам понадобится в дальнейшем для связывания xml описания файла с Java кодом.
interface ModalDialogWidgetUiBinder extends
  UiBinder<Widget, ModalDialogWidget> {
}
 
private static ModalDialogWidgetUiBinder uiBinder = GWT
  .create(ModalDialogWidgetUiBinder.class);

воскресенье, 25 мая 2014 г.

Java справочник для iOS

У меня вышло приложения для iOS. Называется Java справочник.

Java справочник в AppStore



Java Справочник - это разделенный на 4 категории (Аббревиатуры, Технологии, Понятия и Инструменты) словарь, посвященный миру Java программирования. Будет очень полезен начинающим программистам, так как позволит всегда иметь под рукой пояснение для огромного количества новых слов, связанных с Java программированием.

Java справочник в AppStore



Категория Аббревиатуры




Список инструментов Java





Описание одного из инструментов



среда, 14 мая 2014 г.

GWT. How to add Handler on DOM elements

Для того, чтобы в GWT прикрепить EventListener на простой DOM Element необходимо сделать следующее.
final Element element = selector.getInputElement();  
Event.sinkEvents(element, Event.ONKEYUP);
Event.setEventListener(element, new EventListener() {
 
    @Override
    public void onBrowserEvent(Event event) {
        if (Event.ONKEYUP == event.getTypeInt()) {
            Window.alert("ONKEYUP ");
        }
    }
});

Но так можно повесить слушатель только для одного события, для нескольких событий необходимо писать код следующим образом.
Event.sinkEvents(element, Event.ONKEYUP | Event.ONBLUR | Event.ONFOCUS);

Такое написание объясняется тем, что события являются битовыми константами.
/**
   * Fired when an element receives keyboard focus.
   */
  public static final int ONFOCUS = 0x00800;

Метод sinkEvents принимает итоговое значение битов.
public static void sinkEvents(Element elem, int eventBits) {
    // This cast is always valid because both Element types are JSOs and have
    // no new fields are added in the subclass.
    DOM.sinkEvents((com.google.gwt.user.client.Element) elem, eventBits);
}

И для прикрепления к элементу слушателя на несколько событий необходимо провести логическую операцию над используемыми событиями.
final Element element = selector.getInputElement();
Event.sinkEvents(element, Event.ONKEYUP | Event.ONBLUR | Event.ONFOCUS);
Event.setEventListener(element, new EventListener() {
 
 @Override
 public void onBrowserEvent(Event event) {
  if (Event.ONKEYUP == event.getTypeInt()) {
      Window.alert("ONKEYUP ");
      event.preventDefault();
  } else if (Event.ONBLUR == event.getTypeInt()) {
     Window.alert("ONBLUR ");
     event.preventDefault();
  } else if (Event.ONFOCUS == event.getTypeInt()) {
     Window.alert("ONFOCUS ");
     event.preventDefault();
  }
 }
});


воскресенье, 11 мая 2014 г.

iOS 7. Как отсортировать массив

Как отсортировать массив строк по алфавиту

(Как отсортировать NSMutableArray и NSArray)


Допустим есть два массива строк NSArray и NSMutableArray, необходимо отсортировать их по алфавиту.
@property (retain, nonatomic) NSArray *techList;
@property (retain, nonatomic) NSMutableArray *toolList;

Для сортировки NSArray и NSMutableArray используются разные методы.
Для того, чтобы отсортировать NSArray необходимо  воспользоваться методом
- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors;  

Этот метод вернет новый отсортированный массив.

Для того, чтобы отсортировать NSMutableArray необходимо  воспользоваться методом
- (void)sortUsingDescriptors:(NSArray *)sortDescriptors; 

Этот метод отсортирует уже существующий массив

Сортировать массивы будем следующим образом

Сортируем NSArray
NSArray sortedTechList = [techList sortedArrayUsingSelector:
                       @selector(localizedCaseInsensitiveCompare:)];

Сортируем NSMutableArray
[toolList sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

Как отсортировать массив объектов по полю

(Как отсортировать NSMutableArray и NSArray)

Теперь допустим нам необходимо отсортировать массив объектов по определенному полю. Здесь ситуация такая же как и с сортировкой массива строк. Для разных массивов используются разные методы. Если нам необходимо отсортировать массив объектов по полю name, то тогда нам понадобиться воспользоваться классом NSSortDescriptor и методом sortDescriptorWithKey

Сортируем NSArray
NSSortDescriptor *sortDescriptor =
    [NSSortDescriptor sortDescriptorWithKey:@"name"
                                  ascending:YES
                                   selector:@selector(caseInsensitiveCompare:)];
NSArray sortedTechList = [techList sortedArrayUsingDescriptors:@[sortDescriptor]];

Сортируем NSMutableArray
[toolList sortUsingDescriptors:
                    [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" 
                       ascending:YES 
                       selector:@selector(caseInsensitiveCompare:)]]];


iOS 7. UITextView Как убрать пустые места сверху и снизу.

UITextView является Scroll View. iOS 7 автоматически добавляет отступы от содержимого для Scroll View, так как предполагается, что Scroll View будет прокручиваться вверх за навигационную панель и заголовок. 

 До того как убрали пустые места


После того как убрали пустые места


Чтобы предотвратить это необходимо переопределить новый метод UIViewController'а 
-(BOOL)automaticallyAdjustsScrollViewInsets {
    return NO;
}

или в методе viewDidLoad сделать следующее
- (void)viewDidLoad
{
    [super viewDidLoad];
 
    ...
    self.automaticallyAdjustsScrollViewInsets = NO;
}

вторник, 8 апреля 2014 г.

iOS 7 Три книги

Решил хорошенько изучить программирование под последнюю версию ios 7. Для этого мне очень хорошо подошла серия из трех книг от издательства O'REILLY.  Книги конечно можно читать в любой последовательности, но лучше это сделать в том порядке, в котором я их тут перечислил.

1. iOS 7 Programming Fundamentals


В этой книге рассказывается об основах программирования под ios 7. Начинается с самого нуля.



2. Programming iOS 7


Здесь уже говорится о более сложных вещах.



3. iOS 7 Programming Cookbook


А в этой книге собраны рецепты по разработке для ios 7. Очень большое количество интересных примеров и приемов.





понедельник, 7 апреля 2014 г.

Android. How to create Key Hashes for Your Facebook Application

Для подключения Facebook логина к вашему Android приложению нам понадобится прежде всего создать само приложение на сайте для разработчиков
Там созданное приложение получит APP ID. Также нам понадобится файл ключа (файл *.keystore), которым будет подписываться само Android приложение и пароль к нему. На сайте https://developers.facebook.com/ там, где создадите ваше приложение, необходимо зайти в раздел Settings, нажать там кнопку Add Platform и добавить Android. Там необходимо будет ввести значение пакеджа вашего приложения и класса активити, из которого будет запускаться логин через Facebook. Так же там будет еще одно интересное поле - Key Hashes. Это поле для ввода хэш-ключей которые будут связывать ваше Android-приложение c Facebook. Далее я расскажу как сгенерировать эти ключи.


воскресенье, 2 марта 2014 г.

Жизненный цикл Apache Maven

Жизненный цикл проекта — это список поименованных фаз, определяющий порядок действий при его построении.

По умолчанию Maven использует следующий жизненный цикл
  1. process-resources - Разрешение и скачивание зависимостей
  2. compile  - Компиляция исходного кода
  3. process-test-resources - Обработка тестовых ресурсов
  4. test-compile - Компиляция тестовых ресурсов
  5. test - Тестирование
  6. package - Упаковка скомпилированного кода. Обычно JAR или WAR файл
  7. install - Инсталляция проекта в локальном репозитарии
  8. deploy - Инсталляция проекта в удаленном репозитарии

Также стандартный жизненный цикл Maven проекта может быть таким:


Также узнать, как использовать все возможности Maven для сборки проектов можно из книги про Maven "Apache Maven 3 Cookbook"



Как инверсировать слова в строке Java

Для того, чтобы обратить порядок слов в строке необходимо разобрать строку на составляющие элементы. Для этого будем использовать метод класса String split(String arg). В качестве параметра этому методу будем передавать разделитель между словами  - например запятую. Полученный массив строк после этого будем проходить в цикле в обратном порядке и формировать новую строку при помощи класса StringBuilder.

public class StringReverse {
 
  public static void main(String[] args) {
 
    String str = "Иркутск, Иркутская Область, Россия";
    System.out.println("Исходная строка: " + str);
    String array[] = str.split(",");
    StringBuilder sb = new StringBuilder();
    for (int i = array.length - 1; i > 0; i--) {
      sb.append(array[i]);
      sb.append(", ");
    }
    sb.append(array[0]);
    String reverse = sb.toString();
    System.out.println("Строка наоборот: " + reverse);
 
  }
 
}

Результат работы программы