2012-07-04 2 views
0

Мне около 6 недель изучать Java и по-прежнему бороться с реализацией статических методов (думаю, я действительно это понял, но это оказалось неправильным!).Имея трудное время для статического метода, который использует нестатические методы

Я пытаюсь сделать доступной локально сохраненную пару ключ-значение публично. Вот мой исходный код:

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; 
} 

Конечно, я получаю сообщение об ошибке «Не удаюсь сделать статическую ссылку на нестатический getSharedPreferences метода (String, Int) от типа ContextWrapper», поэтому я стараюсь, чтобы обернуть НЕРАСПРОСТРАНЕНИЕ -static метод в моем собственном общедоступном методе, как аналогичный StackOverflow answer указан:

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 вместо этого?

Благодарим за терпение, пока я борюсь со статической номенклатурой.

+0

** Я пытаюсь сделать доступной локально сохраненную пару ключ-значение доступной публично. ** - Помимо ваших проблем со статическим подходом, в основном ** НЕ ** старайтесь делать то, что вы делаете с Android-активностью. Это противоречит философии дизайна Android. Активность Android - это особый случайный класс, и вы не должны публично публиковать какие-либо поля или методы (статические или другие) - изучать/принимать это или быть готовыми к будущим проблемам. Чтобы сделать то, что вы пытаетесь сделать, вы должны, вероятно, расширить класс Application - никогда не делайте этого в рамках Activity. – Squonk

+0

Спасибо. Я фактически создал класс non-Activity для реализации моего подхода, основанного на значении стоимости, но столкнулся с проблемой там (конечно). Поэтому попробовал временно переместить его в «Настройки» (класс «Активность»), как на испытательном стенде, чтобы узнать, может ли быть что-то неотъемлемое свойство onCreate, которое помогло бы (да, я знаю, немой теперь в ретроспективе, но я был в отчаянии). Вернемся к классу non-Activity. – stuckInOldLodiAgain

+0

Какие еще «классы» будут нуждаться в этом методе? – Squonk

ответ

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); 
    } 

...

Эта модель позволяет определение значений по умолчанию, чтобы быть в одном месте.

+0

К сожалению, я не могу создать объект _SharedPreferences_. Поэтому он не может передать объект в качестве параметра метода. (Я должен не понимать ответ). – stuckInOldLodiAgain

+0

@stuckInOldLodiAgain передает контекст и вызывает context.getSharedPreferences()! –

+0

Вы можете вызывать их из любой активности или службы, например Helper.foo (this); –

0

Вы не можете получить доступ к методу не static изнутри статического метода. то, что вы здесь делаете, - это одно и то же. Вы обращаетесь к методу не static, а именно: getSharedPref() изнутри статического метода getDriverNum

+1

вы можете вызвать статические методы из нестатических методов. Вы ошиблись в своем ответе? –

+0

ha! поменял слова. Виноват. – Nishant

+0

Да, точно вправо (с заменой слов). Вот почему я прошу о правильном способе сделать это. Я чувствую себя немного ограниченным, потому что я не могу создать объект _SharedPreferences_ для доступа к _getSharedPreferences_. – stuckInOldLodiAgain

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, поэтому его можно сделать статическим методом и затем получить доступ к другим статическим методам в классе.

+0

Да, спасибо. Я реализовал это как класс (по коду Тома Дигнана ниже). У меня есть привычка к методам чрезмерного использования (мой процедурный фон не делает мне никаких выгод), а не используя классы. Теперь я буду знать лучше. – stuckInOldLodiAgain

0

Просто, вы должны знать две вещи:

  1. вы можете вызывать статические методы в не-статические методы

  2. вы не можете назвать не-статические методы в статических методов в одном классе (кроме вас нового экземпляра другого класса, и вызвать не-статические методы с тем, что объектами)

, именно поэтому вы получите сообщение об ошибке, вы нарушаете второе правило, когда вы звоните getSharedPref() в getDriverNum().

Чтобы решить эту проблему, постарайтесь сделать getSharedPref() статическим, а в свою очередь сделать getSharedPreferences() статическим.

+0

Да, все нормально, кроме _getSharedPreferences() _ - это нестатический абстрактный метод интерфейса _SharedPreferences_. Я не определил их, они являются частью библиотеки Android. И я бы предпочел не пытаться переписать тех, у кого было ограниченное знание Java! :) – stuckInOldLodiAgain

+0

отлично, вы катите его наконец :) – Cruis