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

понедельник, 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;
}