Практические навыки внутреннего программирования на Java

задняя часть
Практические навыки внутреннего программирования на Java

Это 13-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

Использовать режим сборки

  • Вместо того, чтобы генерировать нужный объект напрямую, пусть клиент вызывает конструктор со всеми необходимыми параметрами и получает объект-конструктор
  • Затем клиент вызывает метод, подобный сеттеру, для объекта построителя, чтобы установить каждый соответствующий необязательный параметр.
  • Наконец, клиент вызывает метод сборки без аргументов для создания неизменяемого объекта.

image.png

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

Предпочитайте примитивные типы примитивным типам в штучной упаковке

тестовое задание

image.png

  • Просто из-за неправильного символа переменная 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Существует оптимизация, которая кэширует хэш-код, связанный с каждым элементом.
  • Если хэш-коды не совпадают, то также не нужно проверять равенство объектов

иерархия классов из-за класса метки

Пример счетчика: следующие классы могут представлять круги или прямоугольники.

image.png

  • У этого класса тегов много недостатков: он полон шаблонного кода, включая объявления перечислений, поля тегов;
  • В классе Figure есть только один такой метод:area, этот абстрактный класс является корнем иерархии классов

Затем разложите приведенный выше встречный пример

image.png