Что такое Object class и какие методы он имеет?android-31

Класс Object — это корневой класс в иерархии Java, от которого неявно наследуются все остальные классы. В Kotlin его аналогом является Any, но при компиляции в JVM Any преобразуется в Object.

Основные методы класса Object

  1. toString()

    override fun toString(): String {
        return "ClassName(property=$value)"
    }
    
    • Назначение: Возвращает строковое представление объекта
    • Совет: Всегда переопределяйте для удобства отладки
  2. equals()

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false
        // Сравнение полей
    }
    
    • Контракт:
      • Рефлексивность: x.equals(x) = true
      • Симметричность: x.equals(y) = y.equals(x)
      • Транзитивность: если x.equals(y) и y.equals(z), то x.equals(z)
  3. hashCode()

    override fun hashCode(): Int {
        return Objects.hash(field1, field2)
    }
    
    • Правила:
      • Если equals() возвращает true, hashCode() должен возвращать одинаковые значения
      • Обратное не обязательно верно
  4. getClass() (в Kotlin - javaClass)

    • Возвращает объект Class<?>, содержащий метаинформацию
  5. wait()/notify()/notifyAll()

    • Назначение: Механизм межпоточного взаимодействия
    • Важно: Используйте ReentrantLock или корутины в Kotlin

Особенности в Kotlin

  1. Any vs Object:

    • Any имеет только toString(), equals(), hashCode()
    • Остальные методы доступны через расширения
  2. Автоматическая генерация:

    data class User(val id: Int, val name: String)
    // Автоматически генерирует equals, hashCode, toString
    
  3. Оператор ==:

    • В Kotlin == вызывает equals() (в отличие от Java)
    • Для ссылочного сравнения используйте ===

Полезные методы из java.util.Objects

  1. requireNonNull()

    fun process(value: String) {
        val nonNullValue = requireNotNull(value)
    }
    
  2. hash() (аналог Objects.hashCode())

    override fun hashCode() = hash(field1, field2)
    

Пример реализации контракта equals/hashCode

class Book(val title: String, val year: Int) {
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is Book) return false
        return title == other.title && year == other.year
    }

    override fun hashCode(): Int {
        var result = title.hashCode()
        result = 31 * result + year
        return result
    }
}

Android-специфика

  1. Правила для Parcelable:

    • equals() и hashCode() должны учитывать все поля, участвующие в упаковке
  2. Эффективность в RecyclerView:

    • Качественные equals()/hashCode() улучшают работу DiffUtil

Резюмируем:

понимание методов класса Object критически важно для корректной реализации равенства объектов, работы коллекций и многопоточности. В Kotlin многие методы имеют более идиоматичные аналоги, но принципы остаются теми же. Всегда соблюдайте контракты при переопределении этих методов.