2016-09-05 25 views
1

にいくつかの変数のスコープを拡張する方法を私は匿名クラスをしました。匿名内部クラス

私は試みましたが、失敗しました。 外側のブロックで最終変数を宣言することは、内部で再び初期化できないため機能しません。

+0

匿名の内部クラスの使用を避け、一度内部クラスだったクラスに変更したいオブジェクトを挿入することができます。 – byxor

答えて

1

ここでは、値の格納に役立つ「ホルダー」クラスの使用をお勧めします。これは、データにアクセスするための非常に便利なメカニズムです。個人的には、私はdon't think that having public scoped variables are a good ideaです。

ですから、保持するためにゲッター/セッターとホルダー型オブジェクトを持つことができます:

public class HoldThis { 

    private Uri downloadUri; 

    public void setUri(Uri uri){ 
     this.downloadUri = uri; 
    } 

    public Uri getUri(){ 
     return downloadUri; 
    } 

} 

また、次のような何かにするオプションがあります:

外部クラス:final Uri []uri = new Uri[1];、その後することができますがuri[0] = taskSnapshot.getDownloadUrl();

+0

2番目のオプションはきれいで簡単です。ありがとう –

0

downloadUriの値を設定するメンバーフィールドを追加できます。メソッドが終了すると、そのスタックフレームはメモリから消去されるため、上記のコードを保持するメソッドでは設定できません。

1

問題:それほど簡単ではありません。ご覧のとおり、匿名の内部クラスの考え方は、それが外部のコンテキストから「分離」される可能性があるということです。そのため、ローカル変数のように内部で使用する必要があります。

その解決の「正常な」方法は:のように、外側のクラスにフィールドを追加します。

public class YourClass ... { 
    private Uri downloadUri; 

、今、あなたの内部クラスは、そのフィールドdownloadUriを+読み取り、変更することができます。

O、Ayushinが示唆したように、囲むクラスのメソッドを呼び出して、そのローカルに作成されたUriオブジェクトをパラメータとして提供することもできます。結局のところ、 "whats right"はあなたの全体的なコンテキスト/デザインに非常に依存しています。

+0

関数を呼び出して関数のパラメータとして変数を渡すのはどうですか? –

関連する問題