1

オブジェクトの作成に関していくつか疑問/質問があります。ループ内にオブジェクトを作成するべきではないと聞いたことがあります。ループ内にオブジェクトを作成することの何が問題になっていますか?ループの外側で作成することとループの内側で作成することの違いは何ですか?

次の例を検討してください。

public java.util.List<Object> objectCreationTest(){
    java.util.List<Object> objectList =new java.util. ArrayList<Object>();
    Object obj = null;
    for(int i = 0 ; i <1000;i++){
        Object e = new Object(); //1 -->  Is this object creation wrong? 
        obj = new Object(); //2 --> Is this right way to create?
        objectList.add(e );

    }

    return objectList ;

}

私が従わなければならない方法を教えてください。

4

4 に答える 4

5

ループ内にオブジェクトを作成するべきではないと聞いたことがあります。ループ内にオブジェクトを作成することの何が問題になっていますか?

ループ内でオブジェクトを作成しても問題はありません。多くの(関連する)オブジェクトを作成する唯一の方法である場合があります。

あなたの例では、次のことを簡単に行うことができます。

public java.util.List<Object> objectCreationTest(){
    java.util.List<Object> objectList = new java.util. ArrayList<Object>();
    for(int i = 0 ; i <1000;i++){
        Object e = new Object(); 
        objectList.add(e);    
    }
    return objectList;
}
于 2012-07-06T07:32:55.693 に答える
2

どちらのアプローチも正しいですが、違いはスコープ objとガベージ コレクションです。

public java.util.List<Object> objectCreationTest(){
java.util.List<Object> objectList =new java.util. ArrayList<Object>();
Object obj = null;
for(int i = 0 ; i <1000;i++){
    Object e = new Object(); //1 -->  Is this object creation wrong? 
    obj = new Object(); //2 --> Is this right way to create?
    objectList.add(e );

}

return objectList ;

}

の 1 つのスコープが ループのobj内側にのみ ある場合、ループが終了するとループの外側に到達できなくなり、ガベージ コレクションの対象になります。forケース 2 のスコープobjもループの外側にあります。objectListコレクション アプローチ 1 でオブジェクトを挿入するだけの場合は、アプローチ 2 を使用すると、挿入後にすべてのオブジェクトが 1 つずつガベージ コレクションの対象になるためobj、i= のときに作成される最後のオブジェクトへの参照があるため、より良い方法です。 999 を指定すると、コレクターはobjafter ループの参照が到達可能かどうかをチェックし、全体をスキャンすることを意味します。

于 2012-07-06T07:55:48.470 に答える
0

あなたの場合、これを簡単に行うことができます:

public java.util.List<Object> objectCreationTest(){
    java.util.List<Object> objectList = new java.util. ArrayList<Object>();
    for(int i = 0 ; i <1000;i++){
        objectList.add(new Object());    
    }
    return objectList;
}
于 2012-07-06T07:36:08.330 に答える
0

違いは宣言にあるだけで、実際の作成にはありません。理論的には、2 つの間に違いがある可能性がありますが、それはごくわずかであり、コンパイラーはおそらくそれを取ります。

あなたの例では、これを書くことができます:

public java.util.List<Object> objectCreationTest(){
    java.util.List<Object> objectList =new java.util. ArrayList<Object>();
    for(int i = 0 ; i <1000;i++){
        objectList.add(new Object());    
    }
    return objectList;
}
于 2012-07-06T07:36:49.453 に答える