Автор оригинала: 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 .