2012-01-30 13 views
262

Java'da bir girişimin daha iyi/güzel bir yolu var mı diye düşünüyordum. Bunu yapmak için bir "güzel" sözdizimi bulunmalıdır düşünüyorumBir instanceof in "negat" ın en iyi yolu

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

Ama: Aslında böyle bir şey yapmak.

Varsa ve sözdiziminin nasıl göründüğünü bilen biri var mı?


DÜZENLEME: güzel Tarafından , böyle bir şey diyebilirsiniz:

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

nesi var instanceof' için çok önemli kurallar ... – luiscubal

+4

Her zaman bir değişken yaratabilirsiniz, boolean strIsString = str instanceof olarak String; '... – vaughandroid

+0

yeah @Baqueta, bir seçenektir. Ancak, bir sözdiziminde ya da diğerinde bellek kullanımında hangi farklılıklar olabilir? – caarlos0

cevap

207

Hayır, iyi bir yol yoktur; Seninki kanonik.

+0

evet, öyle görünüyor. Teşekkürler. – caarlos0

42

Sen Class.isInstance yöntemi kullanabilirsiniz:

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

... ama yine de reddedildiği ve oldukça çirkin olan.

+4

biraz daha iyi, fazla parantez kod çirkin, IMHO yapar. – caarlos0

+0

Bu daha yavaş değil mi? – maxammann

+4

Bunun farklı davranışları vardır. Instanceof anahtar sözcüğü alt sınıfları içerir, yöntem, davranış çoğaltmak için Class.isAssignableFrom kullanmanız gerekir. –

15

Genellikle sadece if ancak else yan tümcesi istemezsiniz.

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

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

olarak yazılabilir Yoksa eğer onun bir dize ya da değil bilmek gerekmez böylece kod yazabilirsiniz. Örneğin.

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

bu konuda

str = str.toString(); 
84

Seni "güzel" derken hayal bilmiyorum ama ne olarak yazılabilir? Ben şahsen bunu yayınlanmıştır klasik formda daha kötü olduğunu düşünüyorum ama statik ithalat kullanabiliyorsanız birileri ...

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

hala çirkinse, bu soruyu düzenleyeceğim. .. – caarlos0

+16

+1 canlı alternatif için – hidralisk

+11

Çift mantık başımı acıtıyor :) – rogerdpack

12

gibi olabilir ve ahlaki kod onlara sonra

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); 
    } 
} 

Ve tanır. ..

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"); 
     } 
    }  
} 

Bu sadece akıcı bir arayüz çalışmasıdır, bunu asla gerçek hayat kodunda kullanmam!
Klasik yolunuza git, kodunuzu okuyan başka kimseyi karıştırmaz!

+0

Ben statik ithalattan hoşlanmıyorum .. yine de yardım etmeye çalıştığınız için teşekkürler :) – caarlos0

+5

+1 aldatıcı kod – hidralisk

2

Tamam sadece benim iki sent, kullandığınız bir dize yöntemidir:

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

Veya sadece if-else ...

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

O reddetmek istiyoruz (str instanceof string) '. Bu şekilde programlama yasalarına aykırıdır. –

-1

Nefret

if (!(x instanceof y)) { 
} 
İlgili konular