2012-05-06 15 views
0

Из нескольких классов в моем приложении я хочу получить глобальные значения String, не используя Context. Если я объявляю эти переменные в классе Application, SharedPreferences или Strings.xml, тогда я должен использовать Context для получения/установки его значений.Как объявить глобальные переменные без использования контекста?

Использование Singleton не очень хорошая практика, как я понимаю из this post. Есть ли хороший способ для использования глобальных переменных без использования context?

ответ

0

Создайте глобальный класс или сохраните строку в месте, которое «имеет смысл». Например, если у вас есть класс обувь вы могли бы сделать это:

public class Shoes { 

    public static class BRAND { 
     public static final String NIKE = "nike"; 
     public static final String REBOK = "rebok"; 
     public static final String ADDIDAS = "addidas"; 
    } 

    private String brand; 

    public Shoes() {} 

    public void setBrand(String brand) { 
     this.brand = brand; 
    } 

    public String getBrand() { 
     return this.brand; 
    } 
} 

Теперь вы можете сделать это:

public static void main(String[] args) { 

    Shoes myShoes = new Shoes(); 
    myShoes.setBrand(Shoes.BRAND.NIKE); 
} 

Вы найдете Есть много вещей, как это в Android. Было бы даже лучше, если бы вы использовали перечисления. Надеюсь это поможет.

UPDATE

Если вы хотели бы использовать сеттер и добытчик, то есть 2 решение:

  1. Первые вы должны экземпляр объекта и так как вы хотите только один экземпляр потребуется один шаблон дизайна. Действительно, если вы правильно синхронизируете и дизайн имеет смысл, они могут быть очень хорошими и полезными. В вашей ситуации я не думаю, что это было бы достойно работы.
  2. Вы можете воспользоваться статическим инициализатором и статическими методами. Вы можете просто удалить итоговую декларацию и делать то, что вы хотите с Струны, как это:

    public class Shoes { 
    
        public static class BRAND { 
         public static String NIKE; 
         public static String REBOK; 
         public static String ADDIDAS; 
    
         static { 
          NIKE = "nike"; 
          REBOK = "rebok"; 
          ADDIDAS = "addidas"; 
         } 
        } 
    
        private String brand; 
    
        public Shoes() {} 
    
        public void setBrand(String brand) { 
         this.brand = brand; 
        } 
    
        public String getBrand() { 
         return this.brand; 
        } 
    } 
    

Или использовать передовой опыт капсулирования и сделать это:

public class Shoes { 

    public static class BRAND { 
     private static String NIKE; 
     private static String REBOK; 
     private static String ADDIDAS; 

     static { 
      NIKE = "nike"; 
      REBOK = "rebok"; 
      ADDIDAS = "addidas"; 
     } 

     public static String getNIKE() { 
      return NIKE; 
     } 

     public static void setNIKE(String name) { 
      NIKE = name; 
     } 

     public static String getREBOK() { 
      return REBOK; 
     } 

     public static void setREBOK(String name) { 
      REBOK = name; 
     } 

     public static String getADDIDAS() { 
      return ADDIDAS; 
     } 

     public static void setADDIDAS(String name) { 
      ADDIDAS = name; 
     } 
    } 

    private String brand; 

    public Shoes() {} 

    public void setBrand(String brand) { 
     this.brand = brand; 
    } 

    public String getBrand() { 
     return this.brand; 
    } 
} 

Однако я должен отметить: Если вы делаете это, потому что вы не можете получить контекст, то вам что-то не хватает. Контекст может быть получен из любого места - объекты, создаваемые системой, получают контекст как параметр. Если у вас есть собственный пользовательский объект, вы можете просто передать ApplicationContext в качестве параметра или класса, используя сам объект (это).

+0

NIKE, REBOK и ADDIDAS - это константы в вашем примере. Но я говорю о переменных ... У меня должна быть возможность получить/установить значение. – Sviatoslav

+0

Я обновлю свое решение для вас. – jjNford

0

Сохраните значения в файле strings.xml. Затем назовите это так.

String yourString = Context.getResources().getString(R.string.your_string); 
+0

Он сказал, что не хочет использовать контекст, а 'Context.getResources()' недопустим, поскольку это не статический метод. – MByD

+0

"нестатический метод getResources() не может ссылаться на статический контекст" – Sviatoslav

+0

call getApplicationContext() или getBaseContext() – JakeWilson801

Смежные вопросы