【问题标题】:How can I initialize this int as a constant?如何将此 int 初始化为常量?
【发布时间】:2012-02-03 21:16:51
【问题描述】:

我的软件涉及大量更改图像。我不想重复查找资源编号,而是想创建一些常量来表示每个图像引用。到目前为止,这是我的尝试:

此尝试会在启动时产生强制关闭。

private final int EMPTY = getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud");

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        .....
    }

此尝试返回错误“最终变量可能未初始化”。删除 final 允许它工作。

private final int EMPTY

        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            EMPTY = getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud");
        }

首先在这里使用常量是个好主意吗?

【问题讨论】:

  • 我认为常量的全部意义在于您无法更改值?
  • 我不想更改值。图像将在整个应用程序使用过程中保持相同的 id。
  • final 字段必须在构建对象时设置,因此您必须在构造函数中设置它们。你不能在声明中这样做,因为你的对象还没有准备好,而且那里的方法可能会抛出你永远不会注意到的异常。
  • 真的很奇怪。我在 Oracle 上的 Java 教程和文档 我确信我已经看到了将字段声明为最终实例一次并稍后为其设置值的可能性。唯一的问题 - 你不能做两次,你应该检查一下。你不是碰巧做过两次吗?
  • @Gangus 不。我假设同样的事情,我可以设置一次,不能再设置。

标签: java android constants imagebutton final


【解决方案1】:

首先在这里使用常量是个好主意吗?

没有。最好是从资源中读取值的例程:

public class ImageUtils {

   private static int empty = -1;

   public static int getEmpty(Context context) {
        if(empty == -1)
          empty = context.getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud");

        return empty;
   }

}

【讨论】:

  • 这个,只要确保方法缓存值而不是每次都从文件中读取。
  • 这比仅仅从 int 中删除 'final' 有什么优势?
  • 这是静态的,可以从任何地方调用
【解决方案2】:

不可能将资源加载到常量中。

我已经对该主题进行了搜索并在此处询问了question - 没办法。

这样看 - 它们已经是常数。所以,如果有效性不成问题,你可以给他们我的网站。或者将它们加载到变量中。很伤心,不是吗?

【讨论】:

  • 将其实现为常规/变量 int 是否可以?
  • 是的,我自己就是这么用的。但是我将它用于复杂的结构并且在 Oracle 看到这些代码我希望在更简单的情况下我可以使用“final”。现在你杀了,不是,你杀了那个希望:..(
【解决方案3】:

第一个不起作用,因为您试图在构建类之前调用​​它的方法。第二个不起作用,因为您没有在构造时初始化最终变量。 (它需要在定义或构造函数中完成)。使您的 getResource 操作成为另一个类的静态方法(例如 ResourceUtilities.getResources()),这样它应该可以工作。

【讨论】:

    【解决方案4】:

    创建应用程序类。参见示例here. 然后像这样使用它:

    private final int EMPTY = App.getContext().getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多