Статьи Утилиты Telegram YouTube RuTube Отзывы

Статьи с тэгом «ООП»

Интерфейсы Comparable и Comparator

10 июня 2024

Тэги: Java, Collections, ООП.

Интерфейсы Comparable и Comparator в Java

Интерфейсы Comparable и Comparator, как и Iterable и Iterator (см. Перебор элементов через Iterator), являются частью Java Collections. Подобно тому, как Iterable наделяет объекты свойством перебора в цикле, так и Comparable («сравниваемый») наделяет объекты свойством сравнимости между собой.

Интерфейс Comparable

Данный интерфейс предоставляет универсальный способ сравнивать два объекта между собой. Его контракт состоит из единственного метода compareTo():

interface Comparable<T> {
    int compareTo(T other);
}

Метод сравнивает текущий объект this с другим объектом того же типа other, который передали в параметре. В качестве результата метод возвращает целое число. Этот результат определяется контрактом данного метода и должен принимать одно из следующих значений:

  • 0 – если объекты равны
  • положительное число – если this > other
  • отрицательное число – если this < other
Читать полностью...

Value-классы

11 декабря 2023

Тэги: ООП, Kotlin, руководство.

Иногда в процессе разработки на Kotlin требуется обеспечить более узкую типизацию параметров, чем позволяют стандартные типы. Особенно, если метод принимает несколько параметров одинакового типа, но каждый параметр несёт разный смысл.

Описание задачи

Например, пусть у вас есть метод calculateDensity(), вычисляющий плотность вещества как массу, делённую на объём. Оба параметра передаём как тип Double:

fun calculateDensity(weight: Double, volume: Double): Double =
    weight / volume

Тогда вызов этого метода может выглядеть вот так:

fun main() {
    val density = calculateDensity(3.0, 2.0)
    println("Density: $density.")
}

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

Читать полностью...

Pattern matching в switch

17 ноября 2023

Тэги: Java, руководство, ООП.

В Java 21 наряду с SequencedCollection (см. SequencedCollection и SequencedSet и SequencedMap) из статуса preview в статус production-ready перешла ещё одна фича – шаблоны сравнения (pattern matching) для конструкции switch. Рассмотрим возможности этой конструкции на конкретных примерах.

Простой пример

Предположим, что мы пишем метод displayScale(), в котором надо определить количество знаков после запятой в переданном нам числе. Причём это число поступает на вход как самый базовый тип Object. Напомню, что базовым для всех чисел является класс Number. Его производными типами являются, например, целые числа Integer и числа с произвольной точностью BigDecimal.

Иерархия числовых классов в Java
Читать полностью...

SequencedMap

8 ноября 2023

Тэги: Java, Collections, ООП.

В статье SequencedCollection и SequencedSet в Java мы рассмотрели интерфейс SequencedCollection, который появился в Java 21. Также узнали про его более частный случай – интерфейс SequencedSet.

Теперь перейдём к интерфейсу SequencedMap, который обладает сходным функционалом, но не входит напрямую в иерархию SequencedCollection.

interface SequencedMap<K, V> extends Map<K, V> {
    SequencedMap<K, V> reversed();
    Map.Entry<K,V> firstEntry();
    Map.Entry<K,V> lastEntry();
    Map.Entry<K,V> pollFirstEntry();
    Map.Entry<K,V> pollLastEntry();
    V putFirst(K k, V v);
    V putLast(K k, V v);
    SequencedSet<K> sequencedKeySet();
    SequencedCollection<V> sequencedValues();
    SequencedSet<Map.Entry<K, V>> sequencedEntrySet();
}
Читать полностью...

SequencedCollection и SequencedSet

3 ноября 2023

Тэги: Java, Collections, алгоритмы, ООП.

SequencedCollection

В Java 21 появилась новая группа интерфейсов коллекций, самым основным из которых является SequencedCollection. Он расширяет базовый интерфейс Collection, добавляя в него ряд полезных методов для манипуляций с первым и последним элементами, а также для инвертирования коллекции:

interface SequencedCollection<E> extends Collection<E> {
    void addFirst(E e);
    void addLast(E e);
    E getFirst();
    E getLast();
    E removeFirst();
    E removeLast();
    SequencedCollection<E> reversed();
}

Две основных реализации интерфейса List (ArrayList и LinkedList) также поддерживают этот интерфейс.

Иерархия интерфейсов и классов SequencedCollection
Читать полностью...

Передача null в перегруженный метод

4 января 2018

Тэги: ООП, Java, головоломки.

Такой вопрос на знание Java часто любят задавать на собеседованиях. Предположим, у вас имеется интерфейс, его реализация и наследник этой реализации.

interface MyInterface {
    void doWork();
}

class MyBaseObject implements MyInterface {
    @Override
    public void doWork() {
        System.out.println("Base");
    }
}

class MyChildObject extends MyBaseObject {
    @Override
    public void doWork() {
        System.out.println("Child");
    }
}
Читать полностью...