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

Posted

技术标签:

【中文标题】在android中定义常量的最佳方法是静态类、接口还是xml资源?【英文标题】:Which is best way to define constants in android, either static class, interface or xml resource? 【发布时间】:2012-06-24 10:16:23 【问题描述】:

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

这是保留此常量的最佳方法,java 静态类或 java公共接口或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>

Java 静态常量

public class Config 
    public static final int BUILD_TYPE = 0; // 0 - development, 1 - test, 2 - live
    public static final String[] URL_AUTHENTICATION = "http://development.com/", "http://test.com/", "http://example.com";

【问题讨论】:

我非常怀疑这里的性能问题... Web Service调用是单类还是多类? @venky,在多个类中,每个用于不同的目的,即一个用于用户身份验证另一个用于下载数据等等.. 【参考方案1】:

一般情况:

XML 值在布局文件和清单文件中的可访问性优于 Java 文件中的常量 XML 值比 Java 文件中的常量更有利于多语言支持

【讨论】:

谢谢你 Dheeresh,我明白了,将配置保存在 xml 中非常有用,这些配置可以通过布局、清单和 java 访问【参考方案2】:

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

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

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

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

【讨论】:

资源在不同的风格/构建类型中更容易配置 @Alex 我有一个疑问,请您澄清一下:建议少使用静态变量,所以如果我们使用静态变量创建常量文件,会不会影响我们应用程序的性能? 另外需要考虑的一点是,如果在多个类中使用最终常量,那么如果常量发生更改,则所有这些对象都需要重新编译。但是,如果将常量存储为资源,则情况并非如此。对于需要很长时间编译的大型项目,这可能是一个重要的考虑因素。【参考方案3】:

从您的应用代码中提取 UI 字符串并将其保存在外部文件中始终是一种很好的做法。 Android 通过在每个 Android 项目中的资源目录使这变得容易。

http://developer.android.com/training/basics/supporting-devices/languages.html

【讨论】:

问题是关于仅由 Java 代码在内部使用的常量。这是一个不同的场景。对于属于用户界面的文本标签的具体情况,正如您所提到的,毫无疑问,正确的位置是Android项目的XML资源。【参考方案4】:

我认为这两种方式似乎都不错,但问题是这取决于您的要求。

如果您的 XML 中有您的值(Web 服务链接),并且假设您的值(Web 服务链接)有任何更改,您可以轻松地仅在 XML 文件中进行更改。

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

所以我的建议是从源文件中分离常量并放入资源并访问它..

【讨论】:

"你只能在 XML 文件中轻松更改" 这就像在 Java 文件中更改它一样简单,在这两种情况下您都需要重新构建项目,所以我不认为这是区别,先不说优势。【参考方案5】:

我很高兴有人问这个...加一个!

项目资源需要访问 Context,这在静态方法中不可用(除非您将其传递给 etc),但在 Activity 中始终可用——资源和布局之间似乎存在优先联系。对于可以在静态方法中处理的应用程序变量和常量,我创建了一个抽象类并在所有其他项目类文件中执行(此常量类的)静态导入。

PVS

【讨论】:

【参考方案6】:

对于那些想了解我们如何使用类来定义我们的常量并在我们需要的任何地方调用的人。

常量.java

    package org.nrum.nrum;

/**
 * Created by rajdhami on 5/23/2017.
 */
public class Constant 
    public static final String SERVER = "http://192.168.0.100/bs.dev/nrum";
//    public static final String SERVER = "http://192.168.100.2/bs.dev/nrum";
    public static final String API_END = SERVER + "/dataProvider";
    public static final String NEWS_API = API_END + "/newsApi";
    public static final String BANNER_API = API_END + "/bannerApi/lists";
    public static final String NOTICE_API = API_END + "/noticeApi/lists";
    public static final String UPLOAD_PATH = SERVER + "/uploads";
    public static final String UPLOAD_PATH_BANNER = UPLOAD_PATH + "/company_1/banner";
    public static final String UPLOAD_PATH_NEWS = UPLOAD_PATH + "/company_1/news";
    public static final int BANNER_TRANSITION_DURATION = 5000;
    public static final int NOTICE_BUTTON_BLINK_DURATION = 5000;
    public static final int BANNER_FETCH_LIMIT = 3;

现在我们可以通过以下方式使用上述常量。

Constant.NOTICE_BUTTON_BLINK_DURATION

【讨论】:

问题被问到最好的方法!! @Umar 我想使用不同的不同角色不同的不同的 URL,请帮助,在此之前我使用与 urs 相同的角色【参考方案7】:

如果常量相关或依赖于语言环境或语言或在清单中使用,您可以考虑使用 xml 值

如果常量与翻译或语言环境无关或在清单中使用,我会避免将其放入 xml 资源中

我会在视图模型中添加枚举或任何需要使用常量作为键的东西。

enum class Key
        key,rule,practice
    

或者

const val MY_CONST = "my constant"

【讨论】:

【参考方案8】:

在 Kotlin 中:

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

    companion object 
        const val MY_CONSTANT = "my constant"
    
 

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

【讨论】:

以上是关于在android中定义常量的最佳方法是静态类、接口还是xml资源?的主要内容,如果未能解决你的问题,请参考以下文章

面向对象接口

在 Scala 注释中使用常量的最佳实践

抽象类与接口

面向对象之多态

接口的使用

Java接口内部类包装类装箱拆箱详解!