4

それで、Java で 2 番目のプログラミング クラスを始めたところです。これは、ループと配列を示すために教授から与えられた例です。

public class ArraysLoopsModulus {                       
public static void main(String [ ] commandlineArguments){                   
  //Declare  & Instatiate an Array of 10 integers
  Integer[ ] arrayOf10Integers = new Integer[10];

  //initialize the array to the powers of 2
  Integer powersOf2 = new Integer(1);   
  for(int i=0;i<arrayOf10Integers.length;i++){
    arrayOf10Integers[i] = powersOf2;
    //multiply again by 2
    powersOf2 = powersOf2 * 2;
  }

  //display the powers of 2     
  System.out.println("The first 10 powers of 2 are: ");
  for(int i=0;i<arrayOf10Integers.length;i++){
    System.out.print(arrayOf10Integers[i] + ", ");
  }  
}
}

今後の例をすべて調べたところ、私の教授はプリミティブ データ型を使用していないようです。彼は常に同等のオブジェクト クラスを使用しています (この場合Integerは の代わりにintとのInteger[]代わりにint[])。また、状況によってはオブジェクトを使用する必要があることも理解しています。私の質問は次のとおりです。

オブジェクトを常に使用する理由として考えられるものは何ですか? 特に、プリミティブの使用がより適していると思われるこの単純なケースでは

常にこれを行うのは悪い習慣ですか? 彼を喜ばせるためだけに常にオブジェクトを使用する必要がありますが、実際には可能な場合はプリミティブ データ型を使用する必要があります。

私が示したこの例は、悪いプログラミングと見なされますか?

ありがとう

編集: すべての素晴らしい回答に感謝します。私(初心者)は、ここで見ているものが最善のコーディング方法ではないことを確認する必要がありました.

4

9 に答える 9

12

オブジェクトを常に使用する理由として考えられるものは何ですか?

理由はありません。このコードは醜いです。コレクションを使用する場合、オブジェクトとしてのプリミティブには利点がありますが、例では使用されていません。

特に、プリミティブの使用がより適していると思われるこの単純なケースでは

絶対に正しいです。この場合のオブジェクトはより悪く、より多くのメモリが必要であり、あなたの例では利点がありません。

常にこれを行うのは悪い習慣ですか?

はい、必要な場合にのみオブジェクト (ボックス化されたプリミティブ) を使用する必要があります。コレクションでの使用に加えて、そのようなオブジェクトは にすることもできますnull。これは、「(まだ) 存在しない値」などとして使用できる利点です。

彼を喜ばせるためだけに常にオブジェクトを使用する必要がありますが、実際には可能な場合はプリミティブ データ型を使用する必要があります。

いいえ、これは意味がないと彼に伝えてください。しかし、覚えておいてほしいのは、あなたの教授は決してプログラミングのレッスンを行いたがらなかったということです。彼はおそらくそうするように「強制」されました。

私が示したこの例は、悪いプログラミングと見なされますか?

はい。最大悪い!

于 2013-01-11T18:23:50.393 に答える
9

Effective Javaジョシュア・ブロックから、

項目49:ボックス化されたプリミティブよりもプリミティブ型を優先します。プリミティブ型とボックス化されたプリミティブの間には、主に3つの違いがあります。

  • プリミティブには値のみがありますが、ボックス化されたプリミティブには、値とは異なるIDがあります。

  • プリミティブ型をnullにすることはできませんが、ボックス化されたプリミティブはnullにすることができます。

  • プリミティブ型は、ボックス化されたプリミティブよりもスペースと時間の効率が高くなります。

ボックス化されたプリミティブで==演算子を使用する場合は注意が必要です。これは、他の参照型と同様に、IDを比較するため、ほぼ確実に値を比較する必要があるためです。ボックス化されたプリミティブが==演算子を使用してプリミティブと比較される場合、プリミティブ型はボックス化され、IDが比較されるため、ここでも注意が必要です。

特にループ内でのボクシングとアンボクシングのプロセスは、パフォーマンスを著しく妨げる可能性があります。

基本的に、コレクション内やパラメーター化された型など、プリミティブ型を使用できない場合を除いて、ボックスプリミティブは避ける必要があります。

これが違いを理解するのに役立つことを願っています。

于 2013-01-11T18:26:52.193 に答える
4

ほとんどの人は、可能な場合はプリミティブを使用する必要があることに同意します。悪魔の代弁者を演じるために、私は 1 つの利点を考えました。

初期化を忘れたため、このコードは null ポインター例外をスローしますmyInteger

private Integer myInteger;

public void run () {
    int myNewInt = myInteger + 5;
}

を使用するintと、処理が進み、間違いに気づきにくくなります。


これは、私が遭遇した別の同様の利点です:データの不在を表すことができます。構成オプションを返すメソッドがあります。を返す署名がありますboolean。構成オプションがシステムに存在しなかったことが判明しました。しかし、それを言う代わりに、デフォルトで false になっています (何かを選択する必要があります)。その結果、この値が false に設定されていると思っていましたが、欠落していることが判明しました。メソッドが を返した場合、バグはより明白になりBooleanます。

于 2013-01-11T18:38:38.367 に答える
1

いいえ、どこでもプリミティブ型のオブジェクト ラッパーを使用しないでください。

1) 同等のオブジェクトは、プリミティブ型よりも多くのメモリを使用します。

2) 2 つのIntegerオブジェクトの無効な比較の原因となる可能性がありますequals。メソッドを使用してそれらを比較する必要があります。便利ではありません。

オブジェクト ラッパーを使用する唯一の賢明な理由はgenerics、いくつかの を使用する必要がある場合ですClass。たとえば、 や などのコレクションList<Integer>ですMap<Integer, Double>

もう 1 つの理由は、null数値の代わりに変数の値を格納する必要がある場合です。

提供されたコード ブロックには、多くの冗長な部分があります。

于 2013-01-11T18:22:56.403 に答える
1

オブジェクト ラッパーは、通常使用する同じプリミティブを保持するためだけに新しいオブジェクトを作成するため、プリミティブはよりスペース効率が高くなります。最近のJavaには、教授のコードが完全に遅くなったり壊れたりしないようにする多くの最適化がありますが、それは確かに悪い習慣です。

一般に、ArrayList などの Java Collection にプリミティブを格納する場合は、特に @MrSmith42 が提案するように、オブジェクトのサポートが必要であることが判明しない限り、必要な場所でプリミティブを使用する必要があります。

ラッパー オブジェクトの配列を作成する正当な理由はほとんどありません。プリミティブ配列はスペース効率が非常に高く、オブジェクトの配列はその効率をすべて失います。

于 2013-01-11T18:23:21.767 に答える
1

たとえば、プリミティブは に格納できませんCollectins

オートボクシングは役に立ちますが、帽子は自分ではなくコンパイラによってラップされるだけです。

于 2013-01-11T18:18:09.870 に答える
0
powersOf2 = powersOf2 * 2;

バイトをシフトするのはどうですか?

//次のようなものよりもプリミティブに変換します:

powersOf2  = powersOf2 << 2; 
于 2013-01-11T18:30:20.147 に答える
0

The Number ClassesチュートリアルのJava ドキュメントによると、プリミティブではなく Number オブジェクトを使用する理由が 3 つだけ指定されています。以下にリストされていない他の理由は、悪いプログラミングと見なされると思います。

  1. オブジェクトを期待するメソッドの引数として (数値のコレクションを操作するときによく使用されます)。
  2. クラスで定義された MIN_VALUE や MAX_VALUE などの定数を使用して、データ型の上限と下限を指定します。
  3. クラス メソッドを使用して、値を他のプリミティブ型との間で変換したり、文字列との間で変換したり、数値システム (10 進数、8 進数、16 進数、2 進数) 間で変換したりします。
于 2016-06-19T00:14:03.087 に答える