Несколько советов начинающим Java- и Android-разработчикам

Используте средства языка. Их обилие может пугать, но к ним легко привыкнуть.

Аннотации

Поведение аннотированных методов более очевидно. Можно использовать, например, @Nullable и @NotNull; в Android для внесения различия между int, int и int используются всякого рода @StringRes, @DrawableRes, @LayoutRes и им подобные; для задания API Level есть @TargetApi(int).

Интерфейсы и их реализации

Между этими строками

Map<String, String> map = new HashMap<>();
HashMap<String, String> map = new HashMap<>();
разница главным образом теоретическая: хэш-карта стала практически монопольной реализацией карты. Но здесь
List<String> list = new ArrayList<>();
ArrayList<String> list = new ArrayList<>();

уже наблюдается практическое отличие. Когда я встречаю в коде второй вариант, переделываю его в первый. Если вдруг мне попадётся list.delete(x), я с уверенностью заменю ArrayList на LinkedList, ведь даже ежата знают, что внутренняя реализация ArrayList.delete — это копирование массивов, т. е. O(n), а linkedList.deleteO(1).

Эффективность против поддерживаемости

Ты же занимаешься объектно-ориентированным программированием, верно? Значит, ты согласен на некоторые накладные расходы ради скорости и качества разработки, поддерживаемости кода. Тогда не стоит, например, жалеть стек вызова. Например, вместо

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. Значительная часть общего кода была вынесена туда. Потому что именно для этого создано ОО.

Будьте в меру ленивы

Столкнулся с задачей: надо создать список RecyclerView, в котором можно редактировать текст и сохранять его.

Конечно, самое простое решение — вешать TextWatcher на каждый EditText. Но я сделал иначе.

У BaseViewHolder создал абстрактный метод refresh(); BaseAdapter вызывает его в onViewRecycled. Метод обязан выцепить информацию из CustomEditText. Он делает это вызовом editText.to(model, "field"); У BaseRecycler также есть метод refresh(), он получает ViewHolder'ы всех видимых элементов списка и вызывает refresh() на них.

Ранее монструозный, код сохранения теперь выглядит так:
private void save() {
	mRecycler.update();
	// Сохраняем mData, где уже лежат свежие модели
}

include

Java лишилась Сишного #include в силу категорического изменения модели повторения кода.

А вот вёрстка для Android пишется на XML и позволяет этот самый оператор использовать. Например:

<include layout="@layout/part_toolbar_black" />

или

<include layout="@layout/part_add_fab" />

Опять же, и логическое разделение, и облегчение восприятия, и поддерживаемость.


← клик, если это интересно   |   ↓ место для вопросов и идей