2

抽象メソッドが実装された、匿名の内部クラスとしてほとんどインスタンス化される抽象クラスがあります。これらのインスタンスは渡されるので、コードの別の場所で、これらのインスタンスの1つである新しいインスタンスのコピーを取得したいと思いますが、メソッドは同じ方法で実装されています。これが私のコードの例です:

public abstract class AbstractClass {
String id;
Entity owner;
public AbstractClass(String id){
    this.id=id;
} 
public Mover(){
    id="This is an id";
}
abstract void update();
}

私はそれを次のようにインスタンス化します:

AbstractClass instance= new AbstractClass("This is a test"){
void update(){
//do stuff
}
}

後で、update()が同じことを行う、そのインスタンスの参照ではなくコピーが必要ですが、所有者は別のエンティティになります。リフレクション(.getClass.newInstance())を使用しようとしましたが、java.lang.InstantiationExceptionが発生します。なぜこれが機能しないのですか、そして私がしていることを行うためのより良い方法がありますか?

4

4 に答える 4

6

newInstance()を介して匿名内部クラスをインスタンス化することはできません。非静的内部クラスは、コンテナObjectへの参照を保持します。それらを作成するには、そのObjectが必要です。

Javaチュートリアル->ネストされたクラスを参照してください

于 2012-05-30T19:58:36.630 に答える
2

この例外は、次の2つの場合にスローされます(ドキュメントから)。

  • クラスオブジェクトは、抽象クラス、インターフェイス、配列クラス、プリミティブ型、またはvoidを表します
  • クラスにはnullaryコンストラクターがありません

私が行った簡単なテストに基づくと、あなたの場合、問題は、結果の匿名クラスにnullaryコンストラクターがないことです。

テストコード:

import java.util.*;
import java.lang.*;

class Main
{
        public static void main (String[] args) throws java.lang.Exception
        {
            {
            Test thing = new Test(){ public void update(){ id="updated"; } };

            thing.update();

            Test thang = thing.getClass().newInstance();

            System.out.println( thing.id+" "+thang.id );
            }

            {
            Test2 thing = new Test2("name"){ public void update(){ id="updated"; } };

            thing.update();

            Test2 thang = thing.getClass().newInstance();

            System.out.println( thing.id+" "+thang.id );
            }

        }
}

abstract class Test{
    public String id;
    Test(){ id = "Empty"; }
    abstract public void update();
}

abstract class Test2{
    public String id;
    Test2(String me){ id = me; }
    abstract public void update();
}

最初のテスト(with Test)は問題なく実行され、2番目のテスト(with)はその例外を除いて呼び出しでTest2失敗します。newInstance

于 2012-05-30T20:09:50.883 に答える
1

オブジェクトのクローンを作成し、Cloneableインターフェースを実装し、cloneメソッドを追加して、そのオブジェクトのクローンを作成するために必要なことを定義したいようです。この単純なケースでは、新しいオブジェクトをインスタンス化してIDを設定することを意味しますが、実際の実装はもう少し進んでいると思います。

于 2012-05-30T19:59:01.273 に答える
1

匿名の内部クラスには名前は必要ありません!'instance'という名前のオブジェクトを作成しない でください。たとえば、メソッドの引数として抽象クラスのコピーが必要な場合は、'instance'を作成して使用するのではなく、直接使用してください。

someObject.methodToBeUsed(new AbstractClass("This is a test"){
   void update(){
   //do stuff
});
于 2012-05-30T20:30:46.633 に答える