2016-03-30 25 views
2

arrayで初期化するオブジェクトのデフォルト値を定義する方法はありますか?それらの配列を宣言するときのプリミティブ型が初期化されているのと同様に配列内のオブジェクトをデフォルト値で初期化する - java

int[] myIntArray = new int[5]; // we now have an array of 5 zeroes 
char[] myCharArray = new char[2]; // an array in which all members are "\u0000" 

など

私は私がしました型のオブジェクトの配列を宣言したいと思います同様の方法で自動的に初期化されます。 これは、配列内の各インデックス(デフォルトのコンストラクタを使用)に対してnew myObject()を実行することを意味します。

私はオンラインで関連するものを見つけることができませんでした。最も近いのはArrays.fill(myArray, new MyObject())の配列を初期化した後です。実際には1つのオブジェクトを作成してポインタを配列に埋め込みます。配列を調べて各セルを初期化します。

ありがとうございました!

EDIT:これは配列だけでなく、一般的なオブジェクトの宣言と値のデフォルト化/自動化の初期化にも役立ちます。

+1

をこの動作がうまく[JLS](https://docs.oracleで定義しています。 com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5)。 – Maroun

+3

ソリューションが組み込まれていません。割り当てられたときにJavaが配列をゼロにするのと同じ方法ではありません。これはまさに素晴らしい解決策です: 'Stream.generate(新しい)MyObject())。limit(5).toArray(MyObject [] :: new)' – Cardano

+0

あなたはこれが正確に何をしているのか詳しく説明できますか?ありがとう! –

答えて

6

のJava 8の方法:

MyObject[] arr = Stream.generate(() -> new MyObject()) 
    .limit(5) 
    .toArray(MyObject[]::new); 

これは、サプライヤー() -> new MyObject()によって生成オブジェクトの無限Streamを作成総所望の長さに流れを制限し、配列にそれを収集します。

あなたがオブジェクトか何かにいくつかのプロパティを設定したい場合は、あなたがより複雑サプライヤーかもしれない:

() -> { 
    MyObject result = new MyObject(); 
    result.setName("foo"); 
    return result; 
} 
1

それを宣言するときに、あなたが配列を初期化することができ、これを行います。

int[] myIntArray = {0, 0, 0,0,0}; 
char[] myCharArray = { 'x', 'p' }; 

あなたはできるコースの操作を行います。で

int[] myIntArray = new int[5]; 

と初期値にすべてのインデックスを設定し、forループ。

用:配列が大きければ..しかしこれは...

編集しばらく時間がかかることができますカスタムオブジェクトだけのinitに

例匿名のコンストラクタを使用するのと同じである:私はJavaは、これを行うために提供する方法が表示されていない

public class SOFPointClass { 

private int x; 
private int y; 

    public SOFPointClass(int x, int y) { 
    this.x = x; 
    this.y = y; 
} 

    // test 
    public static void main(String[] args) { 
     SOFPointClass[] pointsArray = { new SOFPointClass(0,0) , new SOFPointClass(1,1)}; 
    } 
} 
+0

私はそれが彼が望むものだとは思わない。彼はオブジェクトについて話している。 –

+1

私は実際にオブジェクトについて話しています。私はint型とchar型の配列を、プリミティブ型で何が起こるかの例として与えました。これはオブジェクトで何をしたいのかです。 (そして、私は女性です。ただちょっと言っています:) –

+0

ああ、今すぐ取得します。SOFPointClassの回答で更新を見てください。 –

0

を。

私の提案は、それを行う機能を定義することです。

Object[] initialize(Class aClass, int number) throws IllegalAccessException, InstantiationException { 
    Object[] result = new Object[number]; 
    for (int i = 0; i < number; ++i) { 
     result[i] = aClass.newInstance(); 
    } 
} 

次にJavaではObject[] arr = initialize(YourClass.class, 10)

0

としてそれを呼んで、配列はタイプのデフォルト値で初期化されます。たとえば、intのデフォルトは0です。オブジェクトの配列のセルのデフォルト値はnullです。これは、配列セルがメモリスロットへの参照のみを保持するため、オブジェクト自体が含まれているためです。既定の参照先はnullです。これを別のデフォルト値で埋めるには、前述のようにArrays.fill()を呼び出さなければなりません。

Object[] arr=new Object[2]; 
Arrays.fill(arr, new Object()); 
+0

ありがとう、私が述べたように、私のテストではこれが同じ便利ではない新しいオブジェクト(少なくともこの場合は...) –

+0

あなたは必要なものを手に入れました..ループかJava 8で上記の方法でストリームを使用します –

0

は、私の知る限りでは(それは私がについて知らない外部ライブラリがあるかもしれないと言うことです)どのようなあなただけのプレーンJavaでやって欲しいの方法はありません。

私はヒットとループを配列に取ります。このような何か作業をする必要があります:

myObject[] array = new myObject[5]; 

for (int i = 0; i < array.length; i++) { 
    array[i] = new myObject(); 
} 

あなたはまた、彼の答えで述べたCardanoのように、この使用してラムダを短縮することができます。

関連する問題