2012-02-07 58 views
19
public class TableModel2 extends TableModel1 { ... } 

TableModel2 tableModel = new TableModel2(); 

boolean t1 = tableModel instanceof TableModel1; 
boolean t2 = tableModel instanceof TableModel2; 

Trong ví dụ trên, t1t2true. Vì vậy, làm cách nào tôi có thể phân biệt giữa TableModel1TableModel2 bằng cách sử dụng instanceof?Ví dụ về'instanceof'

Trả lời

16
boolean t2 = tableModel.getClass().equals(TableModel1.class); //False 
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True 
+0

Cung cấp kiểm tra NULL được thêm vào cho tableModel trước khi thực hiện điều này, trong đó instanceof không yêu cầu nó. –

1

Vâng, tôi không tin bạn có thể. Từ góc độ thừa kế tableModel là tham chiếu hoàn toàn hợp lệ cho cả hai loại, vì vậy instanceof sẽ trả về giá trị đúng trong cả hai trường hợp.

4

Bạn không thể. Nếu bạn thực sự cần phải nói với người khác ra, sử dụng tableModel.getClass() thay vào đó, như trong:

boolean t1 = tableModel.getClass() == TableModel1.class; 
boolean t2 = tableModel.getClass() == TableModel2.class; 

Lưu ý mặc dù bạn đang cố tình cố gắng để phá vỡ một trong những nguyên tắc của OOP sáng lập, do đó hãy chắc chắn rằng bạn không thể tránh lừa này trước khi bạn sử dụng nó trong một mã thực.

7

Vì vậy, làm cách nào tôi có thể phân biệt giữa TableModel1 và TableModel2 bằng instanceof?

Về mặt kỹ thuật, bạn có thể kiểm tra xem tableModel là một thể hiện của TableModel1không và thể hiện của TableModel2:

(tableModel instanceof TableModel1) && !(tableModel instanceof TableModel2) 

Tuy nhiên, tôi muốn khuyến khích bạn trong các điều khoản mạnh nhất có thể để tránh bất kỳ mã chi nhánh dựa trên kết quả của instanceof hoặc getClass(). Mã như vậy là rất mong manh khi đối mặt với những thay đổi trong tương lai. Nếu bạn thấy mình làm bất cứ điều gì dọc theo những dòng này, đó là một đầu mối mạnh mẽ rằng đây có thể là thời điểm tốt để xem lại thiết kế của bạn.

+0

gì sẽ xảy ra nếu tôi thêm 'TableModel3'? 'TableModel25'? – alf

19

Bạn không thể làm điều đó với instanceof, nhưng bạn có thể làm điều đó với getClass:

boolean t1 = tableModel.getClass().equals(TableModel1.class); 
boolean t2 = tableModel.getClass().equals(TableModel2.class); 

Nhà điều hành instanceof được thiết kế để kiểm tra lớp phân cấp tất cả các cách, xuống java.lang.Object, bao gồm cả kiểm tra cho tất cả các giao diện . Nó cho phép bạn biết nếu một thể hiện của đối tượng mà bạn có có thể được truyền tới kiểu mà bạn đã chỉ định mà không kích hoạt ngoại lệ diễn viên lớp. Mặt khác,

getClass trả về lớp cụ thể của đối tượng đã cho.

5

thể hiện của có nghĩa là "là một".

TableModel2 IS A TableModel1. 
But TableModel1 IS NOT A TableModel2. 
so 

package main; 

public class TempClass { 
    public static void main(String[] args) { 
     TableModel1 tableModel1 = new TableModel1(); 
     TableModel1 tableModel2 = new TableModel2(); 

     System.out.println(tableModel1 instanceof TableModel1); 
     System.out.println(tableModel1 instanceof TableModel2); 

     System.out.println(tableModel2 instanceof TableModel1); 
     System.out.println(tableModel2 instanceof TableModel2); 
    } 

    public static class TableModel1 { 
    } 

    public static class TableModel2 extends TableModel1 { 
    } 
} 

true 
false 

true 
true 
+0

lớp công khai TableModel2 mở rộng TableModel1 {...} Vì vậy "instanceOf" không hoạt động ở đây –

+0

tableModel1 và tableModel2 chúng đều là TableModel1. Vì vậy, ví dụ cho sự thật. Nhưng tableModel1 KHÔNG PHẢI là TableModel2. – kornero

1

dễ dàng, sử dụng tên lớp:

public class Test 
{ 
    public class TableModel1 
    { 
    }; 

    public class TableModel2 extends TableModel1 
    { 
    }; 

    public TableModel2 tableModel = new TableModel2(); 

    public static void main(String[] args) 
    { 
     Test t = new Test(); 
     System.out.println("t1=" + t.tableModel.getClass().equals(TableModel1.class)); 
     System.out.println("t2=" + t.tableModel.getClass().equals(TableModel2.class)); 
    } 
}