2011-12-13 13 views
16

は、次の操作を行うことができますか?C#で匿名オブジェクトを作成するJavaに相当するものは何ですか?</p> <p><code>var objResult = new { success = result };</code></p> <p>このためのJava同等のがあります:C#ので

+0

「成功」とは何ですか?結果は何ですか? – belgther

+1

成功は、結果の変数の現在の型に解決された任意のオブジェクトの結果、フィールドの名前になります。 '' int result = 3; ' ' var obj = new {success = result}; ' objは1つのフィールドを持つクラスです。int success – Bas

+0

正しい。私の場合、「成功」は「ブール」であり、「結果」は「真」または「偽」でした。 – Cody

答えて

19

JavaはC#にvarキーワードで提供される型推論を持たないため、匿名型を作成することはできますが、その属性を取得できないためあまり良くありません。

だから、あなたがそうのような匿名クラスのインスタンスを作成することができます。

Object myobj = new Object() { 
    public final boolean success = true; 
} 

しかしmyobjは、あなたのコード内でsuccessにアクセスすることはできませんObjectのインスタンスであり、あなたがのインスタンスを作成したとして以来、 匿名クラス定義上、このクラスを明示的に参照する方法はありません。

C#varでは、型を推測することでこれを解決しますが、これをJavaで行う方法はありません。

通常、匿名クラスはインターフェイスと抽象クラスの実装を作成するために使用されるため、インターフェイスまたは親クラスを型として参照します。

+3

これを読むためには、読みやすさを拡張するためのいくつかのプロパティを持つ単純なクラス/型用のクラスファイルを作成する必要があることは絶対に間違いです。 Yikes。 – Codebeat

+0

ええ、私は本当に.Netプロジェクトからjavaに移行することに満足していません。これはナッツです –

1

匿名のクラスの形で類似しているが同一ではない機能があります。違いは、特定の名前付きインターフェイスを実装するか、名前付きクラスを拡張する必要があることです。

だから、
SomeInterface obj = new SomeInterface() { 
    // implement the interface 
} 

、あなたの例を近似する:

interface Result 
{ 
    bool getSuccess(); 
} 

// ... 

bool result = DoSomething(); 
Result objResult = new Result() { 
    bool getSuccess() { return result; } 
} 

しかし、この例のための多くのゲインはありません。あなたは間違いなくあなたは、この場合にはやったことの値にインスタンス化さsuccessフィールドが含まれていObjectのインライン匿名のサブクラスを作成している

Object objResult = new Object() { 
    boolean success = result; 
} 

と同等のものを書くことができます

http://www.docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

+0

名前以外の機能はあまりよくありません。 –

+0

匿名ではありません。 – CKuck

+0

クラスは匿名です。インターフェイスはそうではありません。 – CodesInChaos

8

result(ここではブール値であると仮定していますが、何でも構いません)。

しかし、これはあまり有用ではありません。Javaは強く型付けされており、作成した匿名クラスを参照する方法がないため、どこでも変数successを参照することはできません。匿名のサブクラスは、通常、単一メソッドのインタフェースを実装するため、またはおそらくスーパークラスのメソッドをオーバーライドするために使用されます。これらの両方の場合は、他のコードが親クラス/インタフェースで宣言されたメソッドを介してオーバーライドされるため、あなたは文字列化された結果を得るためにobjResult.toString()を呼び出すことができるよう

Object objresult = new Object() { 
    @Override public String toString() { 
     return result.toString(); 
    } 
} 

この動作は、現在公開されています

ので役に立つかもしれないオブジェクトの匿名のサブクラスでは、次のようなものである可能性があります。

実際には、代わりにgetResult()メソッドを使用してインターフェイスを定義し、具体的または匿名クラスのいずれかでこれを実装する方がよいでしょう。

+0

ええ、私はそれが難しい方法を見つけました。あなたが言ったように、何が良いのか分かりません。 - ちょうどあなたの編集を見ました。 – Cody

8

あなただけの苦労を再度情報を抜け出すがあります

Object objResult = new Object(){ public final boolean success = result; }; 

あなたはリフレクションを使用する必要がフィールドを取得するには:あなたが必要とするフィールドsuccessの異なるタイプの

objResult.getClass().getDeclaredField("success").getBoolean(objResult) 

値のための異なるゲッター。

+0

作成された匿名クラスにはパッケージの可視性があります。この匿名クラスを作成したものではないパッケージでこれをどうやって行いますか? –

0

Javaには、戻り値によって実装された型を暗黙的に定義するための同等の機能はありません。最も近い同等のコードは、手作りの実装と一緒に「取得」メソッドのインターフェースを定義することだと思います。

interface Result { 
    boolean success(); 
} 
Result objResult = new Result() { 
    public boolean success() { return result; } 
}; 

特定の問題に対してJavaのようなアプローチをとる方がよいでしょう。 C#匿名オブジェクトとJava匿名クラスの名前は似ていますが、機能はありません。

関連する問題