2016-11-06 4 views
0

すべてのオブジェクトの値が空であることをチェックするメソッドを作成したいと思います。入力オブジェクトがnullならばreturn true;です。入力が配列の型である場合、長さを確認してください。以下は、私の方法はプリミティブ空の配列をチェックする方法

public static boolean isEmpty(Object input) { 
    if (input == null) { 
     return true; 
    } 
     if (input instanceof Collection) { 
     if (((Collection<?>) input).size() == 0) { 
      return true; 
     } 
    } 
    if (input instanceof String) { 
     if (((String) input).trim().length() == 0) { 
      return true; 
     } 
    } 
    if (input instanceof Object[]) { 
     if (((Object[]) input).length == 0) { 
      return true; 
     } 
    } 
    return false; 
} 

このロジックを実装することである。しかし、私は、この

int[] a = {}; 
float[] b = {}; 
Integer[] c = {}; 
Float[] d = {}; 
System.out.println(Validator.isEmpty(a)); 
System.out.println(Validator.isEmpty(b)); 
System.out.println(Validator.isEmpty(c)); 
System.out.println(Validator.isEmpty(d)); 

のようにテスト中の問題は、私はabfalseである理由は分からないです。誰かが私を説明できますか?

+2

:次に、あなたはその長さを(奇妙に、あなたはlengthフィールドを取得するためにClass#getFieldを使用することはできません、ので)を取得するためにArray.getLengthを使用することができます'new float [0] instanceof Object []'を実行したときに得られる結果を確認しましたか? –

+1

この方法には具体的な理由はありますか?異なる型引数を取る3つの異なる 'isEmpty'メソッドの使用を検討しましたか? – pathfinderelite

+0

@ T.J.Crowderおっと!私は '互換性のない条件付きオペランド型float []とObject []'を持っています – Cataclysm

答えて

5

float[]instanceof Object[]ではありません。すべての種類の配列をチェックする場合は、オブジェクトからクラスを取得し、そのisArrayメソッドをチェックしたいと思うでしょう。あなたの持っている*「私はaとbが偽である理由はわかりません。」*

import java.lang.reflect.*; 

class Validator { 
    public static void main(String args[]) throws Exception { 
     int[] a = {}; 
     float[] b = {}; 
     Integer[] c = {}; 
     Float[] d = {}; 
     System.out.println(Validator.isEmpty(a));   // true 
     System.out.println(Validator.isEmpty(b));   // true 
     System.out.println(Validator.isEmpty(c));   // true 
     System.out.println(Validator.isEmpty(d));   // true 
     System.out.println(Validator.isEmpty(new float[3])); // false (just double-checking) 
    } 

    public static boolean isEmpty(Object input) { 
     if (input == null) { 
      return true; 
     } 
     if (input instanceof String) { 
      if (((String) input).trim().length() == 0) { 
       return true; 
      } 
     } 
     if (input.getClass().isArray()) { 
      return Array.getLength(input) == 0; 
     } 
     return false; 
    } 
} 
+0

ありがとう、コード例です。私はまだこれの前に '私の方法を変える方法? 'については悩んでいます。 – Cataclysm

+0

@Cataclysm:ええ、それは私が予想していた以上の痛みであることが判明しました。私は 'Class#getField'が私に配列の' length'フィールドを与えることを拒否することを期待していませんでした。ドキュメンテーション、それが判明した)。 –

関連する問題