Skip to content

Instantly share code, notes, and snippets.

@queses
Last active March 22, 2018 14:45
Show Gist options
  • Save queses/be4c31015805fa45c72a699b6cd6b091 to your computer and use it in GitHub Desktop.
Save queses/be4c31015805fa45c72a699b6cd6b091 to your computer and use it in GitHub Desktop.
Сниппеты Java
/**
* Работа с Generic и Class
* - универсальные классы, методы;
* - вызов неизвестных компилятору методов;
* - динамическая установка значений полей;
* В примере - объект Query, реализующий объектный "поиск" по "базе данных" (нет)
* Диаграмма классов возможной реаализации: https://user-images.githubusercontent.com/14962059/37777435-5f173254-2e09-11e8-87be-3ce42840db9f.png
**/
package qss;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Repository r = new Repository();
r.test();
}
}
// Модель специалиста
class Specialist {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// Модель клиента
class Client {
private Double money;
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
}
class MyQuery<T> {
// Находит одну модель по запросу
public T one(Class<T> c) {
try {
return loadModel(c, this.execute());
} catch (Exception e) {
return null;
}
}
// Загружает в модель данные из БД
private T loadModel(Class<T> c, Map values) throws Exception {
T inst = c.newInstance();
Method[] methods = c.getMethods();
for (Method method : methods) {
if (method.getName().startsWith("set")) {
String attr = CaseService.camelToSnake(method.getName(), 3);
Object value = values.get(attr);
method.invoke(inst, value);
}
}
return inst;
}
// Получет данные из БД. В данном примере просто пропишем их в коде
private Map execute() {
HashMap<String, Object> values = new HashMap<>();
values.put("name", "DynamicBoi");
values.put("money", 3000.50);
return values;
}
}
// Репозиторий с данными
class Repository {
// Универсальный метод, возвращающий нужный MyQuery
public <T> MyQuery<T> find() {
MyQuery<T> q = new MyQuery<>();
return q;
}
// Запуск поиска
public void test() {
System.out.println("Specialist Test:");
MyQuery<Specialist> specialistQuery = this.find();
Specialist specialist = specialistQuery.one(Specialist.class);
System.out.println("Specialist name: " + specialist.getName());
System.out.println("\nClient Test:");
MyQuery<Client> clientQuery = this.find();
Client client = clientQuery.one(Client.class);
System.out.println("Client money: " + client.getMoney());
}
}
// Бонус - перевод из CamelCase в snake_case
class CaseService {
public static String camelToSnake(String text, Integer start) {
return camelToSnake(text.substring(start));
}
public static String camelToSnake(String text) {
char[] chars = text.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (!Character.isUpperCase(chars[i])) continue;
// else:
String replacement;
if (i == 0) replacement = String.valueOf(Character.toLowerCase(chars[i]));
else replacement = "_" + Character.toLowerCase(chars[i]);
text = text.replaceAll(String.valueOf(Character.toUpperCase(chars[i])), replacement);
chars = text.toCharArray();
}
return text;
}
}
@queses
Copy link
Author

queses commented Mar 22, 2018

Class Diagram

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment