哪个是在android中定义常量(静态类,接口或xml资源)的最佳方法?


98

我正在开发一个使用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"};
}

1
我高度怀疑性能是否会成为问题...
Alex Lockwood 2012年

Web服务调用是单类还是多类?
Venky 2012年

@venky,在多个类,每一个用于不同的目的,即一个用于用户认证的另一个下载数据等..
Jayabal

Answers:


92

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

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

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

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


在不同的版本/构建类型中配置资源变得容易
HopefulHelpful

@Alex我有一个疑问,您能否清除它:建议减少使用静态变量,因此,如果我们使用静态变量创建常量文件,会不会影响应用程序的性能?
帕拉维

2
还有一点要考虑的是,如果在多个类中使用了最终常量,那么在更改常量后,所有这些对象都需要重新编译。但是,如果常量存储为资源则不是这种情况。对于可能需要很长时间才能编译的大型项目,这可能是一个重要的考虑因素。
orodbhen

23

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

Constant.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

1
有人问问题最好的方法!
shadygoneinsane

@Umar我想使用不同的角色不同的URL,请帮助,在我使用urs之前,请先使用
Kuldeep Singh

11

一般情况下:

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

1
谢谢您Dheeresh,您知道,将xml配置保持在布局,清单和Java均可访问这非常有用
Jayabal 2012年

2

从应用程序代码中提取UI字符串并将其保存在外部文件中始终是一个好习惯。Android通过每个Android项目中的资源目录使此操作变得容易。

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


问题是常量只能由Java代码在内部使用。这是另一种情况。正如您提到的,对于属于用户界面的文本标签的特定情况,毫无疑问,正确的位置是Android项目的XML资源。
cesargastonec

2

我认为这两种方法似乎都不错,但实际情况取决于您的要求。

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

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

因此,我的建议是将常量与源文件分开,放入资源中并对其进行访问。


1
“您可以轻松地仅在XML文件中进行更改”就像在Java文件中进行更改一样容易,并且在两种情况下都需要重新构建项目,因此我认为这没有什么区别,但请保留优势。
弗朗·马佐亚

0

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

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

聚苯乙烯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.