Писать новый класс, невзирая на существующие
private static class SomeViewHolder extends RecyclerView.ViewHolder {
SomeViewHolder(View itemView) {
super(itemHolder);
}
}
Правильное решение: оглянуться вокруг в поисках подходящих классов. В проекте уже может быть несколько таких пустых ViewHolder'ов.
Аналогично, если абстрактный класс не выполняет своё предназначение или работает ошибочно, его нужно удалить или исправить, но не избегать.
Генерировать геттеры и мутаторы ко всем полям
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
Правильное решение: разобраться, какие поля можно мутировать, а какие предназначены только для чтения, и генерировать только то, что нужно.
Наполнять новый объект мутацией
Item item = new Item();
item.setAaa(another.getAaa());
item.setBbb(another.getBbb());
item.setCcc(another.getCcc());
Правильное решение — конструктор или статическая фабрика для этих целей:
public Item(Another another) {
this.aaa = another.getAaa();
this.bbb = another.getBbb();
this.ccc = another.getCcc();
}
public static Item from(Another another) {
return new Item(another.getAaa(), another.getBbb(), another.getCcc());
}
В качестве бонуса поля можно сделать финальными.
Писать классы-обёртки
, которые нужны только для того, чтобы добраться до нужной информации, заботливо завёрнутой бэк-эндом в три шкуры:
{ "data": { ... } }
public class SomeResponse {
private Data data;
public Data getData() {
return data;
}
public static class Data {
...
}
}
{ "data":{ "items": [ ... ] } }
public class SomeResponse {
private Data data;
public Data getData() {
return data;
}
public static class Data {
private List<Item> items;
public List<Item> getItems() {
return items;
}
}
}
Правильное решение: зарегистрировать TypeAdapter'ы.