Хороший код должен знать (1)?

Java

1. Используйте статические фабричные методы вместо конструкторов

Преимущества статических фабричных методов:
В отличие от конструкторов, у него есть имя.
Ему не нужно создавать новый объект каждый раз, когда он вызывается.
Он может возвращать объект любого подтипа возвращаемого типа.
Класс возвращаемого объекта может варьироваться в зависимости от входных параметров.
При написании класса, содержащего метод, класс возвращаемого объекта может не существовать.

2. Пожалуйста, используйте режим конструктора, когда слишком много параметров конструктора

Когда в объекте слишком много свойств, при использовании конструктора слишком много параметров затрудняют его сопровождение, и трудно прочитать, что означает каждый параметр.

Использовать конструктор для создания обязательных параметров и использовать сеттеры для передачи необязательных параметров? Кажется, что у него мало параметров, создать экземпляр легко, а сгенерированный код легко прочитать. Но поскольку сам шаблон JavaBeans имеет серьезные недостатки, JavaBeans может находиться в несогласованном состоянии из-за того, что конструкторы разделены на несколько вызовов, и для обеспечения безопасности потоков требуется дополнительная работа.

Лучший способ справиться со слишком большим количеством параметров — использовать шаблон построителя, который сочетает в себе безопасность шаблона масштабируемого конструктора с удобочитаемостью шаблона JavaBeans, а затем вызвать метод, подобный сеттеру, объекта построителя, чтобы установить каждый необязательный параметр. .

3. Используйте внедрение зависимостей для внедрения ресурсов

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

4. Не создавайте ненужных объектов

Если объект неизменяем, его всегда можно использовать повторно, например, класс String является окончательным, неизменяемым, лучше не использовать новую строку («тест»), потому что каждый раз будет создаваться новый объект. Используйте примитивы, а не упакованные примитивы, где производительность имеет решающее значение, и остерегайтесь непреднамеренного автоупаковывания, поскольку они могут повлиять на производительность.

5. Удалите просроченные ссылки на объекты

Это также известно как утечка памяти. Когда класс управляет собственной памятью, он должен опасаться утечек памяти. Всякий раз, когда элемент освобождается, любые ссылки на объекты, содержащиеся в элементе, должны быть очищены.

Еще одним распространенным источником утечек памяти является кеш. Как только ссылка на объект помещена в кеш, легко забыть о его существовании.WeakHashMap можно использовать для представления кеша.

6. Избегайте механизмов Finalizer и Cleaner, используйте оператор try-with-resources.

Неопределенность для механизма Finalizer и Cleaner, мы не знаем точно, когда он выполнится. Например, полагаться на механизмы Finalizer и Cleaner для закрытия файлов — серьезная ошибка, поскольку дескрипторы открытых файлов являются ограниченным ресурсом. Если из-за системной задержки запуска механизмов Finalizer и Cleaner открывается много файлов, программа может дать сбой, поскольку больше не может открывать файлы. Вы можете использовать оператор try-with-resources или оператор try-finally.При открытии нескольких файлов оператор try-finally не так читаем, как оператор try-with-resources, поэтому рекомендуется оператор try-with-resources.

7. При переписывании метода equals также перепишите метод hashcode

При переопределении метода equals должны быть соблюдены следующие характеристики.
рефлексивность: Объект должен быть равен самому себе.
симметрия: любые ненулевые ссылки x и y, x.equals(y) должны возвращать true тогда и только тогда, когда y.equals(x) возвращает true.
переходность: Если первый объект равен второму объекту, а второй объект равен третьему объекту, то первый объект должен быть равен третьему объекту.
последовательность: если два объекта равны, они всегда должны оставаться равными, если только один (или оба) объекта не будут изменены.
непустой: x.equals(null) должен возвращать false для любой ненулевой ссылки x.

Каждый раз, когда вы переопределяете метод equals, вы должны переопределять метод hashCode, иначе программа не будет работать должным образом. Метод hashCode должен следовать общему соглашению, заданному классом Object, для назначения разных хэш-кодов разным объектам экземпляра.

8. Всегда переопределяйте метод toString

Класс Object предоставляет метод toString, реализация которого представляет собой имя пакета + имя класса + @ + беззнаковое шестнадцатеричное число хэш-кода. Общее соглашение для toString требует, чтобы возвращаемая строка была «кратким, но информативным представлением, которое легко читать людям». Метод toString необходим для удобочитаемости.

9. Рассмотрите возможность реализации интерфейса Comparable

В сценариях, где требуется сопоставимость, лучше всего реализовать интерфейс Comparable, чтобы его экземпляры можно было легко сортировать, искать и использовать в коллекциях на основе сравнения. Избегайте использования операторов «» при сравнении значений полей в реализации метода compareTo. Лучше использовать метод статического сравнения в классе-оболочке или метод сборки в интерфейсе Comparator.

10. Минимизируйте доступность классов и членов

Хорошо спроектированный компонент скрывает все детали своей реализации, четко отделяя свой API от своей реализации. Затем компоненты взаимодействуют только через свои API и ничего не знают о внутренней работе друг друга. Известный как сокрытие информации или инкапсуляция, это фундаментальный принцип разработки программного обеспечения.

В Java существует четыре уровня доступа:
приватный - доступен только самому себе.
package-private — уровень по умолчанию, доступный любому классу в том же пакете.
защищенный - доступный для подклассов и самих себя.
public - доступный для любого класса.

PS:
Очистить горы и чистые воды начинаются с пыли, и знания более ценны, чем усердие.
У меня есть вино, у тебя есть история?
Публичный аккаунт WeChat: "Чистить пыль чат".
Добро пожаловать в чат и поговорим о коде.