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