是否可以更改最终变量(Android)的值?

时间:2013-09-05 15:12:25

标签: java android

(我知道final无法更改。但如果您阅读我输入的示例,您就可以理解为什么我会问这个问题!)

我正在阅读示例hello world Android应用程序:

MainActivity.java

public final static String EXTRA_MESSAGE = "com.example.helloworld.MESSAGE";
....
....
intent.putExtra(EXTRA_MESSAGE, message);

它是如何工作的?我们是否将消息值存储在EXTRA_MESSAGE中?

此外,我可以存储多少SharedPreferences存储数据?假设我的应用程序需要存储级别和高分,我该怎么做?

public final static String HIGH_SCORE = "com.example.helloworld.HIGH_SCORE";
public final static String LEVELS = "com.example.helloworld.LEVELS";

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();

如何更改上述行以保存级别和分数?

6 个答案:

答案 0 :(得分:3)

如有疑问,请查看docs

  

static修饰符与final修饰符结合使用,也用于定义常量。最终修饰符表示此字段的值不能更改。

这里定义了什么:

public final static String EXTRA_MESSAGE = "com.example.helloworld.MESSAGE";

是一个常量,意味着保持这样,否则,你可以看到这里出现的错误:

intent.putExtra(EXTRA_MESSAGE, message);

如果要更改Extra_MESSAGE,那么将其先前值作为键的Entry可能会“丢失”(无法访问,更确切地说,因为您没有在某处保存该值其他人)。

为了保存更多信息,您需要更多地图键。这意味着您在此处正确定义了字段:

public final static String HIGH_SCORE = "com.example.helloworld.HIGH_SCORE";
public final static String LEVELS = "com.example.helloworld.LEVELS";

可用于将这些值存储在给定的映射中,或者用于将它们用作标识符的任何位置(基于键值结构)。这里的概念是你必须定义一个可通过游戏访问的常量,以便能够存储和检索数据。

答案 1 :(得分:0)

否则您无法在分配后更改该值。这就是为什么它被称为 final 。您可以根据需要拥有许多首选项,因为它们只是文件。

intent.putExtra(EXTRA_MESSAGE, message);

想一下地图。这只是一种关键价值关系。 EXTRA_MESSAGE是,消息是

要放,你做 -

preferences.edit().putString("name", "adam");

要获得,您可以使用您使用的密钥 -

preferences.getString("name", "none"); 

教程和参考资料:

Shared Preferences

Vogella

答案 2 :(得分:0)

编辑1:

你的问题与原来的问题太不一样了。这是因为你只是误解了它。

MainActivity.java

public final static String EXTRA_MESSAGE = "com.example.helloworld.MESSAGE";
....
....
intent.putExtra(EXTRA_MESSAGE, message);

这段代码并不意味着 EXTRA_MESSAGE 现在正在存储消息。它类似于键/值对。

这意味着:

Intent使用名为value EXTRA_MESSAGE的键存储消息的值,因此如果将值EXTRA_MESSAGE传递给intent,它将为消息赋值。

final已修复。它永远不会改变它的价值,所以它被称为 FINAL

你也不能改变它。它始终被视为常量

有关更多帮助,请参阅final (Java) on Wikipedia

答案 3 :(得分:0)

这一行:

intent.putExtra(EXTRA_MESSAGE, message)

表示您将邮件的值存储在Intent's密钥下的EXTRA_MESSAGE内部地图中。它不会以任何方式改变EXTRA_MESSAGE变量的内容。

答案 4 :(得分:0)

Intent中有一个Bundle,它包含要传递的参数。把它想象成一个映射,所以当你写

intent.putExtra(EXTRA_MESSAGE, message);

它将消息保存到EXTRA_MESSAGE命名的字段中。

所以,如果你想存储高分和级别使用:

public final static String HIGH_SCORE = "com.example.helloworld.HIGH_SCORE";
public final static String LEVELS = "com.example.helloworld.LEVELS";

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(HIGH_SCORE, newHighScore);
editor.putInt(LEVELS, level);
editor.commit();

请注意,如果再次写入HIGH_SCORE或LEVELS,它将覆盖当前值!

答案 5 :(得分:0)

  1. 我可以更改最终变量吗?
  2. 正如您所说,并且您也知道这一点,我们无法正常更改final值,但使用反射API可能会这样,请参阅此an answer to Stack Overflow question Change private static final field using Java reflection

    1. 如何存储 intent.putExtra(EXTRA_MESSAGE, message);
    2. 正如许多答案所说,putExtra以WAP的方式工作,其中特定的键被映射到字符串,整数等类型的特定值。因此,在这种情况下EXTRA_MESSAGE充当密钥,而message充当价值。

      1. 我可以向SharedPreferences添加多少个值?
      2. AFAIK,您可以添加的SharedPreferences数量没有限制,这取决于您,但由于SharedPreferences主要与应用程序设置相关,但并非明确要求,但我们可以选择将大型或个人应用程序数据存储到XML文件或数据库。

        1. 如何保存代码以存储特定值

          editor.putInt(getString(R.string.saved_high_score), newHighScore);
          

          假设newHighScore是您要存储的值,您可以选择更改   getString(R.string.saved_high_score)更像一个更具体的关键字,如级别编号,以便下次更新时,分数会自动被覆盖。