Рубрики
Без рубрики

Поиск класса объекта в Java

Краткое и практическое руководство по поиску класса объекта в Java.

Автор оригинала: Aaron Juarez.

1. Обзор

В этой статье мы рассмотрим различные способы поиска класса объекта в Java.

2. Использование метода getClass()

Первый метод, который мы проверим, – это метод getClass () .

Во-первых, давайте взглянем на наш код. Мы напишем Пользователь класс:

public class User {
    
    // implementation details

}

Теперь давайте создадим Кредитор класс, который расширяет Пользователя :

public class Lender extends User {
    
    // implementation details

}

Аналогично, мы создадим класс Заемщик , который также расширяет Пользователя :

public class Borrower extends User {
    
    // implementation details

}

Метод getClass() просто возвращает класс времени выполнения объекта , который мы оцениваем , следовательно, мы не рассматриваем наследование.

Как мы видим, getClass() показывает, что класс нашего объекта lender имеет тип Lender , но не тип User :

@Test
public void givenLender_whenGetClass_thenEqualsLenderType() {
    User lender = new Lender();
    assertEquals(Lender.class, lender.getClass());
    assertNotEquals(User.class, lender.getClass());
}

3. Использование метода isInstance()

При использовании метода isInstance() мы проверяем, относится ли объект к определенному типу , и по типу мы говорим либо о классе, либо об интерфейсе.

Этот метод вернет true , если наш объект, отправленный в качестве аргумента метода, пройдет тест IS-A для класса или типа интерфейса .

Мы можем использовать метод isInstance() для проверки класса объекта во время выполнения. Кроме того, isInstance () |/также обрабатывает автобокс .

Если мы проверим следующий код, мы обнаружим, что код не компилируется:

@Ignore
@Test
public void givenBorrower_whenDoubleOrNotString_thenRequestLoan() {
    Borrower borrower = new Borrower();
    double amount = 100.0;
        
    if(amount instanceof Double) { // Compilation error, no autoboxing
        borrower.requestLoan(amount);
    }
        
    if(!(amount instanceof String)) { // Compilation error, incompatible operands
        borrower.requestLoan(amount);
    }
        
}

Давайте проверим автобокс в действии с помощью метода isInstance() :

@Test
public void givenBorrower_whenLoanAmountIsDouble_thenRequestLoan() {
    Borrower borrower = new Borrower();
    double amount = 100.0;
        
    if(Double.class.isInstance(amount)) { // No compilation error
        borrower.requestLoan(amount);
    }
    assertEquals(100, borrower.getTotalLoanAmount());
}

Теперь давайте попробуем оценить наш объект во время выполнения:

@Test
public void givenBorrower_whenLoanAmountIsNotString_thenRequestLoan() {
    Borrower borrower = new Borrower();
    Double amount = 100.0;
        
    if(!String.class.isInstance(amount)) { // No compilation error
        borrower.requestLoan(amount);
    }
    assertEquals(100, borrower.getTotalLoanAmount());
}

Мы также можем использовать isInstance() для проверки возможности приведения объекта в другой класс перед его приведением :

@Test
public void givenUser_whenIsInstanceOfLender_thenDowncast() {
    User user = new Lender();
    Lender lender = null;
        
    if(Lender.class.isInstance(user)) {
        lender = (Lender) user;
    }
        
    assertNotNull(lender);
}

Когда мы используем метод isInstance () , мы защищаем нашу программу от попыток незаконного понижения, хотя использование оператора | instanceof в этом случае будет более плавным. Давайте проверим это дальше.

4. Использование оператора instanceof

Аналогично методу isInstance () , оператор instanceof возвращает true , если оцениваемый объект принадлежит к заданному типу — другими словами, если наш объект, на который ссылается оператор с левой стороны, проходит тест IS-A для класса или типа интерфейса с правой стороны .

Мы можем оценить, является ли объект Кредитор типом Кредитор и типом Пользователь :

@Test
public void givenLender_whenInstanceOf_thenReturnTrue() {
    User lender = new Lender();
    assertTrue(lender instanceof Lender);
    assertTrue(lender instanceof User);
}

Чтобы получить более подробное представление о том, как работает оператор instanceof , мы можем найти дополнительную информацию в нашей статье Java instanceOf Operator .

5. Заключение

В этой статье мы рассмотрели три различных способа поиска класса объекта в Java: метод getClass () , метод isInstance() и оператор instanceof .

Как обычно, полные образцы кода доступны на GitHub .