Anteastra notes
суббота, 17 июня 2017 г.
воскресенье, 26 марта 2017 г.
OCJP - Genercis and collections
Это крупный и очень насыщенный подводными камнями раздел. Здесь нужно не только понимать как работают коллекции и дженерики, но и знать многие нюансы используемых классов и интерфейсов.
О банальных вещах писать не буду. Я полагаю нет проблем знать отличия LinkedList, ArrayList, List, Set, HashSet, Map, HashMap и как эти классы и интерфейсы применять и использовать. И как объявлять простые генерализированные структуры из них. К банальным вещам относится diamond оператор <> и приведение типов элементов негенерализированных коллекций.
Начнем с дженериков.
Генерализированные коллекции могут работать с коллекциями не генерализированными. Это позволяется потому, что после компиляции информация о типе коллекции стирается. А вот на этапе компиляции все генерализированные коллекции считаются как будто новыми классами.
Дженерики вообще не сложные, до тех пор пока не появляются следующие слова:
?, super, extend
Главное правило такое:
если коллекция передается для того, чтобы добавить данные, то надо использовать super. Тогда можно добавлять в коллекцию элементы наследников выбранного класса. Если коллекция передается в метод, чтобы извлечь данные, тогда надо использовать слово extend. В таком случае можно доставать элементы выбранного класса.
Модификация - super
Извлечение - extend
С дженериками все остальное довольно прозрачно и понятно.
Коллекции
воскресенье, 7 апреля 2013 г.
Паттерн проектирования: Singleton / Одиночка
Тип паттерна: порождающий
Один из самых легких и полезных паттернов является синглтон. С него можно начинать изучать паттерны проектирования сразу после изучения основ ООП.
Его поведение крайне простое: не допустить существование в программе двух объектов одного класса. Для класса, реализующего синглтон, может существовать только один объект. И класс предоставляет глобальную точку доступа к нему.
Глобальный объект, конечно, усложняет масштабирование системы. И это минус. Но для небольших приложений вполне применим.
Например, часто бывает нужно настроить коннект к базе и потом использовать его из разных модулей. Здесь может прийти на помощь синглтон.
В чем принцип работы?
Во-первых скрываются конструкторы класса модификатором private.
Во-вторых у класса добавляется статическое поле - экземпляр класса, недоступное извне (private).
В-третьих добавляется статический метод возвращающий этот экземпляр getInstance()
Пример простого синглтона:
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static Singleton getInstance(){
if (instance == null){
instance = new Singleton();
}
return instance;
}
}
К сожалению, здесь нет учета работы в многопоточной среде. Поэтому, чтобы не возникло гонки, можно реализовать синглтон так:
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static Singleton getInstance(){
synchronized (this){
if (instance == null){
instance = new Singleton();
}
}
return instance;
}
}
Или даже так:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){
}
public static Singleton getInstance(){
return instance;
}
}
суббота, 6 апреля 2013 г.
Зачем нужен Class.forName при работе с БД
Это статический метод, который возвращает экземпляр типа Class. Но используется он не для получения объекта. Дело в том, что при работе с базами данных нам нужно "загрузить jdbc драйвер". То-есть нам нужно, чтобы экземпляр класса драйвера был загружен в jvm.
Да, именно экземпляр класса, а не объекта. Класс тоже представляет собой некую структуру, которая занимает оперативную память. Более того у класса может быть static-секция, которая инициализирует статические данные класса.
Например для HSQLDB, загрузка класса может выглядеть так:
Класс может быть автоматически загружен при создании экземпляра класса с помощью конструктора. Например так:
Но этот код не скажет нам о проблемах при загрузке класса. А Class.forName может кинуть исключение, которое можно будет обработать.
Да, именно экземпляр класса, а не объекта. Класс тоже представляет собой некую структуру, которая занимает оперативную память. Более того у класса может быть static-секция, которая инициализирует статические данные класса.
Например для HSQLDB, загрузка класса может выглядеть так:
Class.forName("org.hsqldb.jdbcDriver");
Класс может быть автоматически загружен при создании экземпляра класса с помощью конструктора. Например так:
new org.hsqldb.jdbcDriver();
Но этот код не скажет нам о проблемах при загрузке класса. А Class.forName может кинуть исключение, которое можно будет обработать.
private boolean loadDriver() {
try {
Class.forName("org.hsqldb.jdbcDriver");
} catch (ClassNotFoundException e) {
System.out.println("Драйвер не найден");
e.printStackTrace();
return false;
}
return true;
}
Подписаться на:
Сообщения (Atom)