• 締切済み

nullチェックの書き方(java)

javaでnullチェックをするメソッドがあったとします。 private boolean isNull(Object obj){    // objのnullチェックする } 自分的には private boolean isNull(Object obj){    // objのnullチェックする    return obj == null; } と書きたくなってしまうのですが、分かりにくいという指摘をある人からされました。 みなさんでしたら、どのように実装しますか? もしそれによるメリットなんかあったら教えていただきたいです。

みんなの回答

  • tegra
  • ベストアンサー率64% (9/14)
回答No.3

はじめまして。 ってかObjectのNULLチェックをわざわざメソッドに分けなくてもいい気がしますが・・・。 まーあえて書くなら return obj == null; でいいと思います。 このレベルの判定にif文使う必要ないです。

gooelvin
質問者

お礼

ご回答ありがとうございます。 ですよね。同じ考えの人がいて安心しました。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

いや, return obj == null; の方がよほど自然だし「間違えない」という意味でより良い. これが「わかりにくい」というのは, その「わかりにくい」という人間が悪い. if (obj == null) { return true; } else { return false; } でも確かに同じことだけど, このような書き方は読む人間に余計な労力を使わせてしまう. むしろ本当にクラスの中で private boolean isNull(Object obj) と書いているとしたら, そっちの方がおかしい. private boolean isNull() static private boolean isNull(Object obj) のどちらかでしょう.

gooelvin
質問者

お礼

ご回答ありがとうございます。 確かにメソッドにする意味ないかもですね。 private static boolean isNull(Object obj) で定義してますね

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

private boolean isNull(Object obj){    if (obj == null) {     return true;    } else {     return false;    } } うそです。 質問にある書き方でも分かりにくいとかいうなら private boolean isNull(Object obj){    return obj == null ? true : false; } 比較するものが決まり切っていて、その結果をどこかに代入したりするならば、 いちいちifうんたら~なんて書きません。 ifで書くメリットは、そもそも比較がどういうものかを理解できていない人、 三項演算子を知らない人でも理解できる、年配の方にはウケがいいという、 低次元のことしか思いつきませんでした。 他の方法では、比較を行った結果、真ならA、偽ならBとするわけですから、 微々たる差でしょうが、速度的にも、質問にある書き方がベストだと思いますけど。 指摘を受けたならば、最適解を教えてもらい、なぜそれが最適なのかを 当人に問う方が断然早いと思います。

gooelvin
質問者

お礼

ご回答ありがとうございます。 指摘者からされたのは naktakさんの出した最初の例に近いです↓ private boolean isNull(Object obj){    if (obj == null) {     return true;    } else {     return false;    } } 見やすいということなんですが‥好みだと思うんですけどね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 整数値を任意のオブジェクトを格納できるスタッククラスに格納する方法

    class ObjStack { private Object[] mBuf; private int mSP; public ObjStack(int size) { mSP = 0; mBuf = new Object[size]; } public int getSize() { return mBuf.length; } public int getNum() { return mSP; } public boolean isFull() { return mSP == mBuf.length; } public boolean isEmpty() { return mSP == 0; } public void push(Object x) { if (!isFull()) { mBuf[mSP++] = x; } } public Object top() { Object obj = null; if (!isEmpty()) { obj = mBuf[mSP-1]; } return obj; } public Object pop() { Object obj = null; if (!isEmpty()) { obj = mBuf[--mSP]; } return obj; } } 上のプログラムは任意のオブジェクトを格納できるスタッククラスです。 int型の値はオブジェクトではないので、このObjyStackクラスに格納することができない。 整数値をこのObjStackクラスに格納する方法を教えて下さい。

    • ベストアンサー
    • Java
  • Javaのプログラムの質問です。

    Javaのプログラムについての質問です。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。  注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中に番号を振ってあります。 import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; import java.util.List; class LocalList implements List{  private int Count;  private String Data[];  private Iterator ite;  private ListIterator lite;  // コンストラクタ  void mylist(){   Data = new String[10];   Count = 0;  }  (1)  public boolean add(Object str){   if(Count >= 10){    return false;   }   Data[Count ++] = new String((String)str);   return true;  }  public void add(int i,Object str){  }        public boolean addAll(Collection c){   return false;  }        public boolean addAll(int i,Collection c){   return false;  }    (2)  public void clear(){   Count = 0;  }  public boolean contains(Object str){   return false;  }          public boolean containsAll(Collection c){   return false;  }  public boolean equals(Object str){   return false;  }    (3)  public Object get(int i){   return (i >= Count);  }  public int hashCode(){   return -1;  }  public int indexOf(Object str){   return -1;  }  public boolean isEmpty(){   return false;  }  public Iterator iterator(){   return ite;  }     public int lastIndexOf(Object str){   return -1;  }     public ListIterator listIterator(){   return lite;  }     public ListIterator listIterator(int i){   return lite;  }    (4)  public Object remove(int i){   return (i >= Count);  }    public boolean remove(Object str){   return true;  }         public boolean removeAll(Collection c){   return false;  }         public boolean retainAll(Collection c){   return false;  }    (5)  public Object set(int i,Object str){   return Data[i];  }    (6)  public int size(){   return Count;  }  public List subList(int i,int j){   return this;  }  public Object[] toArray(){   return Data;  }  public Object[] toArray(Object[] a){   return Data;  } } class Main {  public static void main(String[] args) {   mylist sub = new mylist();   sub.add("ビルドバーニングガンダム");   sub.add("ライトニングガンダム");   sub.add("ウイニングガンダム");   sub.add("ガンダムフェニーチェリナーシタ");   sub.add("R・ギャギャ");   for(int i = 0; i < sub.size(); i++){      System.out.println(sub.get(i));   }   // 改行   System.out.println();   // setメソッド   sub.set(1,"ガンダムエピオン");   for(int i = 0; i < sub.size(); i++){    System.out.println(sub.get(i));   }   // 改行   System.out.println();   // sizeメソッド   System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n");   // removeメソッド   sub.remove(1);   for(int i = 0; i < sub.size(); i++){       System.out.println(sub.get(i));   }   // clearメソッド   sub.clear();   System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです");    } } setメソッドとremoveメソッド以外は起動するのようになったのですが、この2つがうんともすんとも動きません。ジェネリクス型を使うという考え方もあるらしいのですが、ネットで調べてもピンと来ず寸詰まり状態になってしまっています。後少しだと思うのですが。。。。 どなたかご教授頂けないでしょうか?よろしくお願い致します。

  • javaのプログラミングについての質問です。

    Javaのプログラムについての質問です。長くなってしまいますがご容赦下さい。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。以下が現在までに作成したコードになります。 注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中にコメントを振ってあります。 import java.util.List; import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; class Mylist implements List{   private int Count;   private String Data[];   // コンストラクタ   public Mylist(){    Data = new String[10];    Count = 0;   } /** 実装するaddメソッド @return boolean APIの設定に従う @param e エレメント(要素) **/   public boolean add(E e){    Data[Count] = (String)e;   Count++;   return true;   }   public void add(int i,Object str){   }   public boolean addAll(Collection c){     return false;   }   public boolean addAll(int i,Collection c){     return false;   } /** 実装するclearメソッド **/   public void clear(){     Count = 0;   }   public boolean contains(Object str){     return false;   }   public boolean containsAll(Collection c){     return false;   }   public boolean equals(Object str){     return false;   } /** 実装するgetメソッド @return E エレメント(要素) @param i 指定されたインデックス番号 **/   public E get(int i){      /*     エレメントeに、String型Data[i]を     キャストして格納*/     E e = (E)Data[i];     return e;   }   public int hashCode(){     return -1;   }   public int indexOf(Object str){     return -1;   }   public boolean isEmpty(){     return false;   }   public Iterator iterator(){     return null;   }   public int lastIndexOf(Object str){     return -1;   }   public ListIterator listIterator(){     return null;   }   public ListIterator listIterator(int i){     return null;   }    /**   * 実装するremoveメソッド   * @return E エレメント(要素)   * @param index 指定されたインデックス番号   **/   public E remove(int index){ /* Dataを最大まで回し、iをインクリメントしたData[i++]を String型Dataに格納する*/ for(int i = index; i < Data.length; i++){ Data[i] = Data[index++]; } Count--; E e = (E)Data; return e; } public boolean remove(Object str){ return false; } public boolean removeAll(Collection c){ return false; } public boolean retainAll(Collection c){ return false; } /** * 実装するsetメソッド * @return E エレメント(要素) * @param i 指定されたインデックス番号 * @param element 置き換える要素 **/ public E set(int i,E element){ // String型Dataにelementをキャストして格納 Data[i] = (String)element; // エレメントeにData[i]をキャストして格納 E e = (E)Data[i]; // 値を返す return e; } /** * 実装するsizeメソッド * @return int 指定されたインデックス番号 **/ public int size(){ return Count; } public List subList(int i,int j){ return this; } public Object[] toArray(){ return Data; } public Object[] toArray(Object[] a){ return Data; } } class Main { /** メインメソッド **/ public static void main(String args[]) { Mylist sub = new Mylist(); /* addメソッドを実装し、機体名を要素とする。 addを最大まで回し、getメソッドで要素を取り出して表示する*/ sub.add("ビルドバーニングガンダム"); sub.add("ライトニングガンダム"); sub.add("ウイニングガンダム"); sub.add("ガンダムフェニーチェリナーシタ"); sub.add("R・ギャギャ"); sub.add("ユニコーンガンダム"); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // sizeメソッド System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n"); // setメソッド sub.set(0,"ガンダムエピオン"); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // 改行 System.out.println(); // removeメソッド sub.remove(1); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // clearメソッド sub.clear(); System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです"); } } コンパイルして実行すると、removeメソッドで指定した箇所ではなく、要素の1番最後が削除されています。思うに、removeメソッドを実装する所のfor(int i = index; i < Data.length; i++){の中の条件が違うと思うのですが。。。。 また、現在addには10個箱を作成するようにしていますが、11個目をメインクラス内で用意した場合、例外ではなく新たに箱を作らなければならない、という後だしジャンケン的な事を言われて、思わず「じゃあArrayListでいいじゃないか」と思ってしまいました。 気を取り直してこの3連休で終わらせたいと思っています。ここまでで現状コードの完成は50%かそれ以下だとは思いますが、どなたか上記2点について御教授頂けないでしょうか。よろしくお願い致します。

  • 二分探索木の要素の数を数える、要素を削除する方法

    二分探索木の要素の数を数えるメソッドと、要素を削除するメソッドを加えたいのですが 実装の流れがわかりません。 よろしくお願いします(><) public class BinarySearchTree { Node root; public BinarySearchTree() { } public BinarySearchTree(Node root) { this.root = root; check(); } public int count(String s) { if(s == null) return 0; *ここの中がわかりません return 0; } public boolean remove(String s) { if(s == null) return false; *ここの中がわかりません double sd = toDouble(s); return false; } private double toDouble(String s){ return Double.parseDouble(s); } }

  • JAVAのequalsメゾットに関して

    public class Sample{ private int num; public Sample(int num){ this.num=num; public boolean equals(Sample obj){ if(obj==null){ return false; } return this.num==obj.num; } } ここでのequalsメゾットは、object同一性を比較するものか、それともobejectの同値性を比較するものでしょうか? また、オブジェクトクラスの中のequalsメゾットをみたら return(this==obj); と書かれていますが、これを見る限り同一性を比較するものだと思いますが、「objectクラスのequalsメゾットは同値性を比較するメゾット」と書かれているサイトも多くて、一体どっちが正しいでしょうか? ご回答いただければ幸いです。よろしくお願いいたします。 ※OKWAVEより補足:「Webシステム開発」についての質問です。

    • ベストアンサー
    • Java
  • ComparableとComparatorの違いについてわからなくて困っています。

    ComparableとComparatorの違いについてわからなくて困っています。 以下のURLのサイトを記事を見ているのですが、 http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000179.html http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000180.html java.lang Comparableインタフェース メソッド public int compareTo(Object o) java.util Comparatorインタフェース メソッド public int compare(Object o1, Object o2) public boolean equals(Object obj) これらの違いについてなのですが、URLの記事では、 ・Comparableインターフェイスの実装クラスにしてcompareTo()メソッドを実装するのは、比較対象が明確であり、比較結果が一般的に分かりやすく容易に想像できる場合にのみとした方がよい ・Comparatorは任意の順番でソートしたい場合にも使用できる。例えば、昇順ではなく降順でソートしたい場合や、複数のデータを持つクラスについて細かく比較方法する場合 と記事にありますが、説明がうまく解釈できないです。 ・Comparableは主にラッパークラスやStringなどで使用するためのものなのでしょうか?(実装してるからそうだとは思いますが) 比較対照が明確なので compareToのreturn文で 除算するだけで可能? ・ComparatorはArraysやコレクション、自作クラス向けに任意の順番でソートするためのものなのですか? 自作クラスについてはComparableでもcompareTo()をオーバーライドすれば同じことが可能? 通常はComparator実装クラスのcompare()の中にreturn文でcompareTo()を使用しているような気もします。 この方法だとObject型で引数を渡して、int型に変換して比較になると思いますが、 StringだとComparableを実装してるから、戻り値でint型が返るのかな、 public int compare(String s1, String s2) { return s2.compareTo(s1) } つまり、自作クラスはインスタンスフィールドにある基本型やObject型(String, Integerなど)の値を使い、 基本型においては除算を使用し、オブジェクト(Comparableを実装しているもの)に対してはcompareTo()で比較するのでしょうか? (これで解決したような気もしますが) 質問がわかりずらくてすみません。何か解釈の間違いがあればご指摘お願いします。

  • c# Equalsメソッドについて

     こんにちは、c#初心者です。  以前まで「Object」型から継承される「Equals」メソッドをオーバーライドするときは public bool override Equals(object obj) {   if ( obj is 現在の型 または 任意の親クラスの型 や インターフェイスの型 )     {     //判断処理     }   else     return false; }  または、クラス限定で public bool override Equals(object obj) {   var temp = obj as 現在の型 または 任意の親クラスの型 や インターフェイスの型;   if ( temp != null )     {     //判断処理     }   else     return false; }  のようにしていたのですが、「is演算子なんて封印してしまえばいいのに」と仰る方がいらしたので、「is演算子を使わない方がよいのか?」と、「現在のメソッドの形式に不備はないのだろうか?」ということが気になり質問させていただきました。  is演算子を使わないとなると、もう「typeof演算子」を利用する事くらいしか思いつきません。  主に「is演算子」を使っているのは「Equals」メソッドなので、とりあえず「Equal」メソッドだけで。上記メソッドに不備、改善点があればご指摘願います。

  • 日付の妥当性チェックをする場合

    日付の妥当性チェックをする場合 いつもお世話になっております。 jspで選択された日付を(日付は<html:select>で選択されます。) ActionFormもしくはLogicでどのようにしたらいいかわかりませんでしたので ご質問させて頂きました。 今、私が実装しているActionFormは public class UserDateCheckActionForm extends ActionForm{ private String year; private String month; private String days; //省略(setter,getter) public boolean checkDate(String year, String month, String days){ String strDate = year+month+days; DateFormat format = DateFormat.getDateInstance(); // 日付/時刻解析を厳密に行うかどうかを設定する。 format.setLenient(false); try{ format.parse(strDate); return true; }catch(Exception e){ return false; } とこのように実装しております。これをvalidateメソッドでvalidateし、 存在しない日付(例:2000年2月31日など)をjspからsubmitされたときは jspに<html:errors>にて正しい日付を入力する旨のメッセージを出すように したいと思っております。 validateメソッドは正常に動いており、ここのロジックが悪いのかと思い、 皆様に見直して頂ければと思い、今回質問させて頂きました。 お力添え頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • NULLが返ってこない…。

    原因がわからないため質問をさせて頂きます。 <%-- JSP <input type="text" name="name"> //名前 String name = request.getParameter("name"); Data data = new Data(); //コンストラクタをnew data.setName(name); --%> <%-- class(Bean) private String n = null; public void setName(String name){ if(name != null){ n = name; }else{ n = null; } public String getName(){ if(name != null){ return name; }else{ return name; } } --%> 値をgetParameter()メソッドで取得をして 値をsetName(name);でセットをしています。 セットした側でもし値があるのであれば その値を変数に格納。 もし値がなければnullを変数に格納しています。 しかし System.out.println(data.getName().equals("");//true System.out.println(data.getName().equals(null);//false; となりnullを返してくれません…。 このコードに何を足したらnullを返してくれるのか わかりません。 わかる方がいらっしゃいましたらよろしくお願い致します。

    • ベストアンサー
    • Java
  • [クラス名].[メソッド名].[メソッド名]という書き方。

    javaを勉強している者です。 少しピンと来ない書き方があるのですがそれはタイトルの通りの書き方で、具体的には Main.getMailStore().isNewMail() という書き方です。MailというのがクラスでgetMailStore()というのがそのクラスで宣言されているメソッドで下記のように実装されています。(MailStoreというのはインターフェースとして別のファイルで宣言されています。) private static MailStore _mailStore; public static MailStore getMailStore(){ return _mailStore; } (MailStoreというインターフェースの中にisNewMailというメソッドは宣言されています。) public interface MailStore{ public boolean isNewMail(String uid); } これらだと、最初のMain.getMailStore().isNewMail()というのは、 「まず、MainクラスのgetMailStoreメソッドを呼び出して、そこでreturnされてくるMailStore型のクラスの中の、isNewMailメソッドを呼び出している」というのを一回で書いてしまっている書き方ということで合っているでしょうか?少しピンと来ないので・・(特にreturnされるメソッド(getMailStore)にそのまま.[メソッド]という書き方をのっけるあたりが) よろしくお願いします。

    • ベストアンサー
    • Java
このQ&Aのポイント
  • 女性が会話中に前髪を触るとき、それは緊張や不安を抱えているサインかもしれません。
  • また、前髪を触ることで集中力を高めるため、考えごとや深い思索にふけっている可能性もあります。
  • さらに、前髪を触ることは自己意識や魅力をアピールする行動としても理解されています。
回答を見る