0

私はJavaを学び始めて約6週間ですが、静的メソッドの実装にまだ苦労しています(私はそれを本当に理解していると思いましたが、これは私が間違っていることを証明しました!)。

ローカルに保存されたキーと値のペアの値を公開しようとしています。これが私の最初のコードです:

public class Settings extends Activity implements OnClickListener {
        public Settings(TextView loginText, TextView passwdText) {
    super();
    this.loginText = loginText;
    this.passwdText = passwdText;
}

public static String getDriverNum() {
    SharedPreferences sp = getSharedPreferences(DELEX_SP, MODE_PRIVATE); <---ERROR
    String Login = sp.getString("KeyLgn", "No Login Found");
    return Login;
}

もちろん、「ContextWrapper型から非静的メソッドgetSharedPreferences(String、int)への静的参照を作成できません」というエラーが発生するので、同様のように、非静的メソッドを自分のパブリックメソッドでラップしようとしますStackOverflowの回答が示されています:

public class Settings extends Activity implements OnClickListener {
public Settings(TextView loginText, TextView passwdText) {
    super();
    this.loginText = loginText;
    this.passwdText = passwdText;
}

public static String getDriverNum() {
    String Login = getSharedPref().getString("KeyLgn", "No Login Found"); <-- SAME ERROR
    return Login;
}

public  SharedPreferences getSharedPref() {
    SharedPreferences sp = getSharedPreferences(DELEX_SP, MODE_PRIVATE);
    return sp;
}

しかし、これは、非静的getSharedPreferencesメソッドの呼び出しを解決していないのと同じエラーを引き起こしました。これを解決するための最良の方法は何ですか?代わりにgetSharedPreferencesをラップするクラスを作成するのですか?

私が静的な命名法に苦しんでいる間、あなたの忍耐に感謝します。

4

5 に答える 5

3

静的がどのように機能するかを誤解しているかもしれません。

静的メソッド(または変数)は、クラスのすべてのインスタンスに対して単一のコピーを持ち、それを呼び出すためにクラスのインスタンスを必要としないメソッドです。例えば、

class MyClass {
      public static void sayHello() {
          System.out.println("hello");
      }
 }

それは次のように呼び出すことができます

MyClass.sayHello();

MyClassの新しいインスタンスが作成されていないことに注意してください。

インスタンスメソッドは、クラスの特定のインスタンスを必要とし、通常はクラスの内部状態に依存するメソッドです。

class MyClass {

    // assume this is initialized somewhere in the constructor
    private final String myName;

    public void sayMyName() {
        System.out.println(myName);
    }
}

ここで、クラスの特定のインスタンスが必要になります

MyClass m = new MyClass("Bill");
m.sayMyName();

静的メソッドはクラスの特定のインスタンスに関連付けられていないため、静的メソッドはインスタンスメソッド(またはインスタンス変数)を参照できません。

非静的メソッドは、非静的メソッドと静的メソッドの両方にアクセスできます。

一般に、メソッドがインスタンスの状態に依存している場合、それは非静的メソッドである必要があります。インスタンスの内部状態に依存しない場合は、静的メソッドである可能性があります。

あなたの場合、getSharedPrefはのインスタンスからどの状態にもアクセスしないSettingsので、静的メソッドにすることができ、クラス内の他の静的メソッドからアクセスできます。

于 2012-07-04T03:03:52.667 に答える
0

簡単に言うと、次の2つのことを知っておく必要があります。

  1. 非静的メソッドで静的メソッドを呼び出すことができます

  2. 同じクラスの静的メソッドで非静的メソッドを呼び出すことはできません(別のクラスのインスタンスを新しくし、そのオブジェクトによって非静的メソッドを呼び出す場合を除く)

そのため、エラーが発生します。を呼び出すと、2番目のルールに違反getSharedPref()getDriverNum()ます。

これを解決するには、getSharedPref()静的にし、代わりにgetSharedPreferences()静的にします。

于 2012-07-04T03:24:26.120 に答える
0

非静的メソッドを利用する静的メソッドを作成する場合は、次のようにインスタンスを渡します。

public static void invokeMethod(SomeObject foo) {
    foo.bar();
}

だからあなたがしているのは素晴らしいパターンです。多くのクラスで再利用できる「ヘルパー」(別名コンポジション)に常に使用しています。「SomeObject」をコンテキストにするだけです。

これは、デフォルトの設定を定義するための優れた中心点を取得するためにAndroidで使用するパターンです。

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import java.util.HashMap;
/**
 * Provides support functions for getting preferences as well as a
 * central place for storing default preferences.
 */
public final class PreferencesHelper {
    public static class Preferences {
        public static final String SOME_SETTING = "SOME_SETTING";
    }

   /** This allows us to define our default preferences all in one place */
    private static HashMap<String, Object> sDefaultPreferences =
        new HashMap<String, Object>(){{
        put(Preferences.SOME_SETTING, "value");
    }};

    public static SharedPreferences getDefaultPreferences(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context);
    }

    public static String getString(SharedPreferences prefs, String key) {
        return prefs.getString(key, (String) sDefaultPreferences.get(key));
    }

    /* Convenience method (use when getting only one preference) */
    public static String getString(Context context, String scanner) {
        SharedPreferences prefs = getDefaultPreferences(context);
        return getString(prefs, scanner);
    }

..。

このパターンにより、デフォルト値の定義を1か所にまとめることができます。

于 2012-07-04T03:01:50.177 に答える
0

静的メソッドの内部からstaticメソッドにアクセスすることはできません。ここで行っていることは同じことです。非メソッドにアクセスしていますstatic。つまり、getSharedPref()静的メソッドの内部からアクセスしています。getDriverNum

于 2012-07-04T03:02:10.600 に答える
0

Helperクラスで、Activityクラスの静的変数を渡すだけです。例えば

HelperClass:

public static int getDefaultYear()
{
    return HomeActivity.prefs.getInt("myYear", 10);
}

HomeActivity:

public class HomeActivity extends AppCompatActivity {

public static SharedPreferences prefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   prefs = this.getSharedPreferences(getString(R.string.applicationIdString), Context.MODE_PRIVATE);
   ...
   }
于 2018-11-16T22:19:28.460 に答える