2012-01-05 15 views
0

私は「this」を静的として宣言する方法は?

public String readFile(int file) 
    { 
     try{ 
     InputStream is = this.getResources().openRawResource(file); 
     byte[] buffer = new byte[is.available()]; 
     System.out.print(is.available()); 
     System.out.print(is.available()); 

     while (is.read(buffer) != -1) 
      ; 
     String text = new String(buffer); 
    return(text); 
     } catch (Exception e) { 
      String Ex=" "; 
      return(Ex); 
     } 
    } 

、Gridactivityという名前の活性を有しているが、これは、生のフォルダからファイルを読み込み、文字列に保存し、それを返す)ファイルの読み取り方法 - readFileの(と続きます。ここで私はこの読み込みファイルを静的にする必要があります。しかし、ここでは 'InputStream is = this.getResources().openRawResource(file);'のステートメントは非静的です。 これを静的関数にするには他のクラスやアクティビティからアクセスできますか?

+0

次に、この静的なreadFile()関数をどのように呼びますか?あなたのプログラムのどこかで、 'InputStream is this.getResources()。openRawResource(file)'という文を使う必要があります。これは、呼び出し元関数とreadFile()のどちらでもアクセス可能な他の変数に格納できます。または、readFileをreadFile(InputStream is)として定義し、 'is'を渡します。 – aProgrammer

答えて

2

できません。

インスタンスメソッドは、そのクラスのインスタンス(例えば、Gridactivityのインスタンス)のコンテキスト内で実行されます。 thisは、このコンテキストを参照するキーワードです。静的メソッドにはこのようなコンテキストがないため、thisはどういう意味ですか?

静的メソッドを静的にする方法と静的メソッドから静的メソッドを呼び出すメソッドを静的にする方法があります。つまり、thisインスタンスから必要な情報を引数として明示的に渡す必要があります。だから、代わりに:あなたはインスタンスオブジェクトにthisポイントとして、静的コンテキストでthisを使用することはできません

void myStaticMethod(int i) { 
    System.out.println(i); 
} 
2

void myInstanceMethod() { 
    System.out.println(this.myInt); 
} 

あなたのような何かをする必要があると思います。あなたは、静的メソッドを達成できる

一つの方法は、以下のように、引数としてResourcesを渡すことです:

public static String readFile(Resources resources, int file) { ... } 

そして、最終的には、

InputStream is = resources.openRawResource(file); 
0

あなたが静的の概念を理解していないようですクラスメンバー。

静的なクラスメンバ(変数、メソッド)は、クラスレベルです。つまり、通常のフィールドとメソッドが厳密にインスタンス化されているインスタンスには厳密ではありません。静的でないコンテキストの静的メンバーは使用できますが、その逆はできません。

+0

もし彼がすべてを理解するなら、彼は尋ねないだろう。リソースはその性質上、グローバルなものです。インスタンスからしか使用できないのは不自然です。だから、回避策やそのいくつかが必要です。 2つはここで提案されました。あなたのものはどこにあるの? :-) – Gangnus

+0

男は、簡単に取る、私はJavaの開発者ではなく、Androidと私は彼が静的に苦労しているのを見た、それはすべてです:) –

1

簡単な回避策は、コンテキストを渡すことです。

public static String readFile(Context context, int file) { 
    try{ 
     InputStream is = context.getResources().openRawResource(file); 
[...] 

そして、ここに私のコードの呼び出しです:あなたのケースでは

String content=GridActivity.readFile(this, 123); 
1

は、

public static String readFile(Context context, int file) 

を試してみて、ここでそれを使用します。

InputStream is = context.getResources().openRawResource(file); 

基本的にはあなたが合格あなたのパラメータとしての変数。

getResources()Contextクラスのメソッドです)。

0

静的メンバーとメソッドは、主にクラス名とオブジェクト名でアクセスできます。

キーワードこのは、現在のオブジェクトを意味します。

あなたはこのlnik

+0

傲慢ではない - それは非常に自然な質問です。リソースはその性質上、グローバルなものです。ですから、なぜインスタンスでしか対応できないのでしょうか?それはクラス/インスタンスの問題ではない、それはアンドロイド特有の問題です。 – Gangnus

+0

@Gangnusここに掲載されたコードについては言及していません。タイトルを参照してください、それは質問のメッセージ本文に関連している必要があります。私は正解かどうか? –

+0

私はむしろ著者が何かについて知らないよりも十分に彼の考えを十分に表現していないと考えています。ところで、あなたの答えは絶対にきれいではありません - あなたの最初の文を理解するのに時間がかかりました。クラスオブジェクトよりもクラスインスタンスの用語を使います。オブジェクトはクラスなので:-) – Gangnus

0

で情報をお読みください。あなたはそれを直接行うことはできませんが、静的について知らない場合:あなたはのonCreate機能でそれらに静的変数および負荷値を宣言することができ 。 このを使用できます。

かそこらあなたは静的変数に必要なすべてのリソースをロードすることができ、後でそれらを使用

initAllStaticStuff(this). 

などのonCreateから呼び出さ

initAllStaticStuff(Context context){ 
    someStaticVariable=context.getResources... 
} 

いくつかの初期化関数を作ります。