Несколько советов начинающим Java- и Android-разработчикам
Используте средства языка. Их обилие может пугать, но к ним легко привыкнуть.
Аннотации
Поведение аннотированных методов более очевидно. Можно использовать, например, @Nullable и @NotNull; в Android для внесения различия между int, int и int используются всякого рода @StringRes, @DrawableRes, @LayoutRes и им подобные; для задания API Level есть @RequiresApi(int).
Интерфейсы и их реализации
Между этими строками
Map<String, String> map = new HashMap<>();
HashMap<String, String> map = new HashMap<>();
разница главным образом теоретическая: хэш-карта стала практически монопольной реализацией.
UPD. А вот и нет, есть же LinkedHashMap и TreeMap.
Но здесь
List<String> list = new ArrayList<>();
ArrayList<String> list = new ArrayList<>();
уже наблюдается практическое отличие. Когда я встречаю в коде второй вариант, переделываю его в первый. Если вдруг мне попадётся list.delete(x), я с уверенностью заменю ArrayList на LinkedList, ведь даже ежата знают, что внутренняя реализация ArrayList.delete — это копирование массивов, т. е. O(n), а linkedList.delete — O(1).
UPD. Теперь я делаю с точностью до наоборот: если список изменяемый, он явно ArrayList. Тогда там гарантировано не unmodifiableList. А LinkedList неадекватно потребляет и фрагментирует память, ну его.Эффективность против поддерживаемости
Ты же занимаешься объектно-ориентированным программированием, верно? Значит, ты согласен на некоторые накладные расходы ради скорости и качества разработки, поддерживаемости кода. Тогда не стоит, например, жалеть стек вызова. Например, вместо
public void dispatchMessageToAHedgehog(Hedgehog hedgehog, String message) {
if (aVeryComplexCondition ||
veryComplexCondition2)
return;
if (hedgehog != null) {
//doAComplexTask
//andAnotherOne
} else {
//doAComplexTaskForNull
}
}
стоит написать что-то в этом роде
public void dispatchMessageToAHedgehog(Hedgehog hedgehog, String message) {
if (aVeryComplexCondition ||
veryComplexCondition2)
return;
if (hedgehog != null) {
doAComplexTaskToDispatchAMessageForAHedgehog(hedgehog, message);
} else {
doAComplexTaskToDispatchAMessageForANull(message);
}
}
private void doAComplexTaskToDispatchAMessageForAHedgehog(Hedgehog hedgehog, String message) {
//doAComplexTask
//andAnotherOne
}
private void doAComplexTaskToDispatchAMessageForANull(String message) {
//doAComplexTaskForNull
}
Здесь больше кода, но он чище и понятнее.
Промышленность
Код из реального проекта.
SearchDialog searchDialog = new SearchDialog();
searchDialog.setSearchMethod(MeteorMethods.SEARCH_TITLE);
searchDialog.setCanAddOtherSuggestion(true);
searchDialog.setOnSuggestionChooseListener(defaultChooseListener(mTitleEditText));
searchDialog.show(getActivity());
Такие блоки кода встречались регулярно. Выпилил и построил фабрику. Новый код:
SearchDialog.attachSearchDialog(getActivity, mTitleEditText, SearchDialog.DialogType.TITLE);
Стройте промышленность. Облегчит вам ручной труд.
Объекты же!
В проекте, над которым я работаю, уже до меня были заботливо созданы классы BaseActivity extends AppCompatActivity, BaseFragment extends Fragment, CustomEditText extends AppCompatEditText и даже CustomTextView extends AppCompatTextView. А также добавлены мной CustomRecycler extends RecyclerView, BaseViewHolder extends RecyclerView.ViewHolder и BaseAdapter extends RecyclerView.Adapter. Значительная часть общего кода была вынесена туда. Потому что именно для этого создано ОО.
include
Java лишилась Сишного #include в силу категорического изменения модели повторения кода.
А вот вёрстка для Android пишется на XML имеет одноимённый тег. Например:
<include layout="@layout/part_toolbar_black" />
или
<include layout="@layout/part_add_fab" />
Опять же, и логическое разделение, и облегчение восприятия, и поддерживаемость.