在android中定义常量的最佳方式是静态类、接口还是xml资源?

在android中定义常量的最佳方式是静态类、接口还是xml资源?,android,xml,configuration,constants,static-members,Android,Xml,Configuration,Constants,Static Members,我正在开发一个android应用程序,它使用web服务从服务器获取数据,因此我有三组不同的URL指向点开发系统、测试服务器和实时服务器。每当我想给应用程序测试/直播时,都很难更改URL。所以我计划将其设置为可配置的,这样应用程序就可以根据我的构建类型配置常量获得适当的URL。 所以 java静态类和 java公共接口或xml资源文件什么时候?为什么? 哪个性能更好?,什么时候?为什么? Ex:xml资源 <integer name="config_build_type">0<

我正在开发一个android应用程序,它使用web服务从服务器获取数据,因此我有三组不同的URL指向点开发系统、测试服务器和实时服务器。每当我想给应用程序测试/直播时,都很难更改URL。所以我计划将其设置为可配置的,这样应用程序就可以根据我的构建类型配置常量获得适当的URL。 所以

  • java静态类和 java公共接口或xml资源文件什么时候?为什么?
  • 哪个性能更好?,什么时候?为什么?
Ex:xml资源

<integer name="config_build_type">0</integer>
<string-array name="url_authentication">
    <item >http://development.com/xxxx</item>
    <item >http://test.com/xxx</item>
    <item >http://example.com/xxx</item>
</string-array>
一般情况下:

  • 与java文件中的常量相比,XML值在布局文件和清单文件中具有可访问性的优势
  • 与java文件中的常量相比,XML值在支持多语言方面具有优势

两者之间有一个很大的区别,您可以在XML布局中引用项目资源。它们在应用程序上下文中可用,因此可以在全局应用程序中访问。使用项目资源的最大优点是易于访问,并且允许您显著地组织项目

静态final
常量被编译成java字节码;项目资源在apk中编译成二进制格式。访问任何一个都是非常高效的。。。如果两者之间存在差异,那么最多也只是微不足道的

对于如何在项目中使用资源/常量,没有固定的规则。也就是说,我个人使用资源获取可能需要在XML或java代码中使用的值。另一方面,我通常使用
static final
常量来表示仅由java代码使用且特定于我的实现的值


还请注意,根据设备的当前配置(即屏幕大小、区域设置等),可以在运行时加载XML资源。因此,在决定是否应该用XML或直接在
.java
文件中声明常量时,应该考虑到这一点。

从应用程序代码中提取UI字符串并将其保存在外部文件中始终是一个好的做法。Android在每个Android项目中都有一个资源目录,这就很容易做到


我认为这两种方式似乎都是好的,但问题是这取决于你们的要求


如果您在XML中有您的值(web服务链接),并且假设您的值(web服务链接)有任何更改,那么您只能在XML文件中轻松地进行更改

但是,如果您使用内部类作为静态变量,则必须在所有类文件中进行更改


所以我的建议是将常量从源文件中分离出来,放入资源中并访问它。

我很高兴有人问这个问题。。。加一

项目资源需要访问上下文,这在静态方法中是不可用的(除非您在etc中传递它),但在活动中总是可用的——在资源和布局之间似乎存在优先连接。对于可能在静态方法中处理的应用程序变量和常量,我创建了一个抽象类,并在所有其他项目类文件中进行静态导入(该常量类)


PVS

适用于希望了解如何使用类定义常量并在需要时调用任何类的人

Constant.java

现在我们可以用下面的方法使用上述常数

Constant.NOTICE_BUTTON_BLINK_DURATION

如果常量相关或依赖于区域或语言或在清单中使用,则可以考虑使用XML值

如果常量与翻译、区域设置或清单中的使用无关,我将避免将其放入xml资源中

<integer name="config_build_type">0</integer>
<string-array name="url_authentication">
    <item >http://development.com/xxxx</item>
    <item >http://test.com/xxx</item>
    <item >http://example.com/xxx</item>
</string-array>
我会在viewmodel中添加enum,或者任何需要使用常量作为键的东西

enum class Key{
        key,rule,practice
    }

在科特林:

class Foo() { 
    // any other code for the class Foo 

    companion object {
        const val MY_CONSTANT = "my constant"
    }
} 

此方法特别推荐用于数据对象。

我高度怀疑性能是否会成为这里的一个问题…Web服务调用是在单个类中还是在多个类中?@venky,即在多个类中,每个类都有不同的用途,即一个用于用户身份验证,另一个用于下载数据等等..谢谢你,我理解了,将配置保存在xml中非常有用,两种布局都可以访问这些xml,manifest和javaresources在不同的风格/构建中更易于配置types@Alex我有一个疑问,请您澄清一下:建议使用静态变量更少,如果我们用静态变量创建常数文件,它不会影响我们的应用程序的性能吗?如果在多个类中使用最终常量,那么如果该常量发生更改,则需要重新编译所有这些对象。但如果常量作为资源存储,则情况并非如此。对于一个需要很长时间编译的大型项目来说,这可能是一个重要的考虑因素@Umar我想使用不同的角色不同的URL,请帮助,,,在此之前,我使用的是与urs相同的“您只能在XML文件中轻松更改”,这就像在Java文件中更改一样简单,在这两种情况下,您都需要重建项目,所以我认为这没有什么区别,撇开一个优点不谈,问题是关于仅由Java代码在内部使用的常量。这是另一种情况。对于属于用户界面的文本标记的特定情况,正如您所提到的,毫无疑问,正确的位置是Android项目的XML资源。
const val MY_CONST = "my constant"
class Foo() { 
    // any other code for the class Foo 

    companion object {
        const val MY_CONSTANT = "my constant"
    }
}