Это 13-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
Использовать режим сборки
- Вместо того, чтобы генерировать нужный объект напрямую, пусть клиент вызывает конструктор со всеми необходимыми параметрами и получает объект-конструктор
- Затем клиент вызывает метод, подобный сеттеру, для объекта построителя, чтобы установить каждый соответствующий необязательный параметр.
- Наконец, клиент вызывает метод сборки без аргументов для создания неизменяемого объекта.
- Режим сборки очень гибкий, вы можете использовать построитель задержек для создания нескольких объектов.
- Параметры построителя могут быть скорректированы при создании объекта, а также могут меняться от объекта к объекту.
Предпочитайте примитивные типы примитивным типам в штучной упаковке
тестовое задание
- Просто из-за неправильного символа переменная sum объявляется как Long вместо long, а время выполнения составляет 9254 мс.
- Буду
sumизменить наlongтип, время выполнения964ms
Переписывание Equals должно переопределять Hashcode
Контрпример
public class PhoneNum {
private final short code;
private final short prefix;
public PhoneNum(int code, int prefix) {
this.code = (short) code;
this.prefix = (short) prefix;
rangeCheck(code, 999, "code");
rangeCheck(prefix, 9999, "prefix");
}
private static void rangeCheck(int arg,int max,String name){
if(arg < 0 || arg > max){
throw new IllegalArgumentException();
}
}
@Override
public boolean equals(Object o){
if (o == this){
return true;
}
if(!(o instanceof PhoneNum)){
return false;
}
PhoneNum pn = (PhoneNum)o;
return pn.prefix == prefix
&& pn.code == code;
}
public static void main(String []args){
Map<PhoneNum,String> map = new HashMap<>();
map.put(new PhoneNum(1,2),"jenny");
System.out.println(map.get(new PhoneNum(1,2)));
}
}
- Тогда выход
null, который включает два экземпляра PhoneNum; - Первый используется для вставки в HashMap, второй экземпляр равен первому экземпляру и используется для получения;
- Поскольку класс PhoneNum не переопределяет метод hashcode, два одинаковых экземпляра имеют нежелательные хеш-коды, нарушающие спецификацию hashCode.
- Таким образом, метод put сохраняет объект номера телефона в хэш-базе.
- Метод get ищет номер телефона в другой корзине хеширования, даже если два экземпляра находятся в одной и той же корзине хэшей.
- Метод get также должен возвращать
null,потому чтоHashMapСуществует оптимизация, которая кэширует хэш-код, связанный с каждым элементом. - Если хэш-коды не совпадают, то также не нужно проверять равенство объектов
иерархия классов из-за класса метки
Пример счетчика: следующие классы могут представлять круги или прямоугольники.
- У этого класса тегов много недостатков: он полон шаблонного кода, включая объявления перечислений, поля тегов;
- В классе Figure есть только один такой метод:
area, этот абстрактный класс является корнем иерархии классов
Затем разложите приведенный выше встречный пример