2012-01-30 23 views
262

Tôi đã suy nghĩ nếu tồn tại một cách tốt hơn/đẹp hơn để phủ nhận một instanceof trong Java. Thực ra, tôi làm điều gì đó như:Cách tốt nhất để "phủ nhận" một instanceof

if(!(str instanceof String)) { /* do Something */ } 

Nhưng, tôi nghĩ rằng nên tồn tại một cú pháp "đẹp" để làm điều này.

Ai đó biết nếu nó tồn tại và cách cú pháp trông như thế nào?


EDIT: By đẹp, tôi có thể nói điều gì đó như thế này:

if(str !instanceof String) { /* do Something */ } // compile failure 
+16

Tôi ghét các quy tắc ưu tiên cho 'instanceof' rất nhiều ... – luiscubal

+4

Bạn luôn có thể tạo biến, giống như 'boolean strIsString = str instanceof String;' ... – vaughandroid

+0

yeah @Baqueta, là một tùy chọn. Nhưng, sự khác biệt nào có thể xảy ra trong việc sử dụng bộ nhớ trong một cú pháp này hay cú pháp khác? – caarlos0

Trả lời

207

Không, không có cách nào tốt hơn; của bạn là kinh điển.

+0

vâng, có vẻ như. Cảm ơn. – caarlos0

42

Bạn có thể sử dụng phương pháp Class.isInstance:

if(!String.class.isInstance(str)) { /* do Something */ } 

... nhưng nó vẫn là phủ nhận và khá xấu xí.

+4

tốt hơn một chút, dấu ngoặc đơn dư thừa làm cho mã xấu xí, IMHO. – caarlos0

+0

Đây không phải là chậm hơn rất nhiều? – maxammann

+4

Điều này có hành vi khác nhau. Từ khóa instanceof bao gồm các lớp con, phương thức không, bạn cần phải sử dụng Class.isAssignableFrom để tái tạo hành vi. –

15

Thông thường bạn không muốn chỉ là một số if mà còn là một mệnh đề else.

if(!(str instanceof String)) { /* do Something */ } 
else { /* do something else */ } 

có thể được viết như

if(str instanceof String) { /* do Something else */ } 
else { /* do something */ } 

Hoặc bạn có thể viết mã, do đó bạn không cần phải biết nếu nó là một String hay không. ví dụ.

if(!(str instanceof String)) { str = str.toString(); } 

có thể được viết như

str = str.toString(); 
84

Tôi không biết những gì bạn tưởng tượng khi bạn nói "đẹp", nhưng những gì về điều này? Cá nhân tôi nghĩ nó tồi tệ hơn so với hình thức cổ điển bạn đăng, nhưng ai đó có thể thích nó ...

if (str instanceof String == false) { /* ... */ } 
+0

vẫn xấu xí, tôi sẽ chỉnh sửa câu hỏi. .. – caarlos0

+16

+1 cho thay thế khả thi – hidralisk

+11

Logic kép làm hỏng đầu của tôi :) – rogerdpack

12

Nếu bạn có thể sử dụng nhập khẩu tĩnh, và mã đạo đức của bạn cho phép họ

public class ObjectUtils { 
    private final Object obj; 
    private ObjectUtils(Object obj) { 
     this.obj = obj; 
    } 

    public static ObjectUtils thisObj(Object obj){ 
     return new ObjectUtils(obj); 
    } 

    public boolean isNotA(Class<?> clazz){ 
     return !clazz.isInstance(obj); 
    } 
} 

Và sau đó. ..

import static notinstanceof.ObjectUtils.*; 

public class Main { 

    public static void main(String[] args) { 
     String a = ""; 
     if (thisObj(a).isNotA(String.class)) { 
      System.out.println("It is not a String"); 
     } 
     if (thisObj(a).isNotA(Integer.class)) { 
      System.out.println("It is not an Integer"); 
     } 
    }  
} 

Đây chỉ là một bài tập giao tiếp thông thạo, tôi không bao giờ sử dụng trong mã thực tế!
Đi theo cách cổ điển của bạn, nó sẽ không gây nhầm lẫn cho bất kỳ ai khác đọc mã của bạn!

+0

Tôi không thích nhập tĩnh .. dù sao nhờ cố gắng giúp :) – caarlos0

+5

+1 cho mã số – hidralisk

2

ok chỉ của tôi hai xu, sử dụng một phương pháp là chuỗi:

public static boolean isString(Object thing) { 
    return thing instanceof String; 
} 

public void someMethod(Object thing){ 
    if (!isString(thing)) { 
     return null; 
    } 
    log.debug("my thing is valid"); 
} 
-1

Hoặc đơn giản if-else ...

if (str instanceof String) { 
} else { 
    // Your code, please. 
} 
+1

Ông muốn phủ nhận '(str instanceof Chuỗi) '. Bằng cách này là trái pháp luật của lập trình. –

-1

Có gì sai với

if (!(x instanceof y)) { 
} 
Các vấn đề liên quan