1. 概要

この記事では、Javaでオブジェクトのクラスを見つけるさまざまな方法について説明します。

2. getClass()メソッドの使用

最初に確認するメソッドは、 getClass()メソッドです。

まず、コードを見てみましょう。 Userクラスを作成します。

public class User {
    
    // implementation details

}

それでは、Userを拡張するLenderクラスを作成しましょう。

public class Lender extends User {
    
    // implementation details

}

同様に、Userも拡張するBorrowerクラスを作成します。

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()メソッドを使用する場合、オブジェクトが特定のタイプであるかどうかをチェックし、タイプごとに、クラスまたはインターフェイスについて話します。

このメソッドは、メソッドの引数として送信されたオブジェクトがクラスまたはインターフェイスタイプのIS-Aテストに合格した場合、 trueを返します。

isInstance()メソッドを使用して、実行時にオブジェクトのクラスをチェックできます。さらに、 isInstance()はオートボクシングも処理します。[ X163X]

次のコードを確認すると、コードがコンパイルされていないことがわかります。

@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 演算子は、評価されるオブジェクトが指定されたタイプに属している場合、つまり ifを返す場合、trueを返します。演算子の左側で参照されているオブジェクトは、右側のクラスまたはインターフェイスタイプのIS-Aテストに合格しています

LenderオブジェクトがタイプLenderおよびタイプUserであるかどうかを評価できます。

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

instanceof 演算子がどのように機能するかを詳しく知るには、 JavainstanceOfOperatorの記事で詳細を確認できます。

5. 結論

この記事では、Javaでオブジェクトのクラスを見つける3つの異なる方法、 getClass()メソッド、 isInstance()メソッド、および instanceof演算子。

いつものように、完全なコードサンプルはGitHubから入手できます。