【问题标题】:Make a static reference to non static field android [duplicate]对非静态字段android进行静态引用[重复]
【发布时间】:2014-02-02 01:58:39
【问题描述】:

我正在尝试开发一个 android 应用程序,我需要在其中对非静态变量进行静态 (PLACES_API_BASE) 引用。请查看以下代码。

private static final String PLACES_API_BASE= getResources().getString(R.string.places_api_base);

但是,我收到一条错误消息,

Cannot make a static reference to the non-static method getResources() from the type 

是否有任何可能的解决方法来实现这一点。请帮忙。谢谢!

【问题讨论】:

  • 必须是final吗?
  • @adavis final 与此无关。
  • @alfasin 好吧,是的,它对我有用。如果它不必是最终的,那么他可以为它创建一个 setter,或者在 create() 方法中对其进行初始化。
  • @adavis "for me" 在这里没有立足之地——这不是个人问题。有关详细信息,请参阅 Brian 在上面发布的链接。
  • 重点是final 不是这里真正的问题;不理解对象是。

标签: java android xml static getresource


【解决方案1】:

不,您不能对非静态方法进行静态引用,因为该方法“附加”到“静态”引用(类范围)不“知道”的实例(对象范围)。

【讨论】:

    【解决方案2】:

    没办法。 getResources 是一个实例方法。所以无论如何你都应该在调用它之前创建一个实例。而PLACES_API_BASE是类常量,不属于任何实例。

    【讨论】:

      【解决方案3】:

      以下是您可以解决的方法:

      private final String mPlacesApiBase;
      
      // constructor
      public YourClass(Context context) {
          mPlacesApiBase = context.getResources().getString(R.string.places_api_base);
      

      如果您的类是活动/服务,请将初始化放在 onCreate() 中:

      private String mPlacesApiBase;
      
      @Override
      public void onCreate(Bundle bundle) {
          super.onCreate(bundle);
          mPlacesApiBase = getString(R.string.places_api_base);
      

      我更改了变量名。根据 Java 约定,ALL_CAPS_IDENTIFIERS 用于编译时已知的常量,而不用于动态初始化的内容。前缀m 是成员变量的约定。我还删除了static,因为这里似乎没有必要。

      【讨论】:

      • 我希望 mPlacesApiBase 是静态的。我在其他地方使用它。我无法删除静态修饰符。
      • 你可以拥有它,但你不应该需要它。
      • 我需要它。我在其他地方使用它。那怎么可能?
      • 不好的做法。你的应用程序会经常死掉。您仍然可以使用@laalto 解决方案。只需在声明中添加静态即可。关键是它必须在非静态上下文中初始化(例如构造函数)
      【解决方案4】:

      创建一个对象,然后在方法或构造函数中调用方法 getResources()。

      【讨论】:

      • -1 你也可以说:“使方法getResources() 静态。它不回答问题,而是在没有真正理解问题的情况下尝试“修补”问题。不好的做法!
      • @Dave 已要求解决方法。所以我试图让位相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 2013-02-25
      • 2021-08-31
      • 2021-11-04
      相关资源
      最近更新 更多