(以下是草稿内容,待整理)
本篇文章探讨的是项目运行中对常量的管理和使用
目前对于常量一般有以下几种管理方式:
定义常量类
创建一个静态的常量类,对于常量进行保存。
缺点:每个项目定义的不一样,所以无人指导的话在庞大的代码中快速找到相关配置是很麻烦的事情。而且有些人会在常量类中附加额外的代码逻辑。有的还有类与接口之间的继承和实现,严重加大了代码之间的逻辑复杂程度
定义在build.gradle中
目前由于Android使用gradle进行编译,所以有些项目把常量放在app/build.gradle中进行存放,代码如下:
android{
defaultConfig{
buildConfigField("String", "KEY","12312")
}
}
缺点1:build.gradle是对项目进行编译配置的地方,配置版本号还可以理解,将代码运行中使用的常量放在这里不是很合理
确定2:随着项目的膨胀,常量会迅速膨胀,会使得build.gradle变得冗余。即使可以引入额外的gradle进行拆分,依然不是个很好的方式。另外拆分会导致其余人额外的学习成本(跟定义在常量类中是同样的问题)。
定义在本地SD卡,在项目启动时候解析到Map中,然后项目中全局使用Map中的参数
这种方式,会有额外的逻辑解析,不利于维护。增加学习成本
定义在XML文件中
由于xml读取需要上下文对象等,有些地方获取不到上下文。使用起来也比较麻烦。
properties(这个没见人用过)
缺点1:用的人少,没什么人知道。知道的人越多,成本越低
缺点2:如果项目面向国际化的话,没有采用values进行资源配置,而是也采用properties。也会出现学习成本变大的问题(参考上述的几个方案)
缺点3:无法像静态变量那些直接使用ide进行关联查询,查看哪些地方进行使用。只能使用全局搜索的方式查看在哪些地方使用
这里常量管理使用properties文件,
可以通过以下链接对properties有个简单的了解:
https://blog.csdn.net/Mr_Tony/article/details/79122936
properties在Android中除了local.properties,gradle.properties这些基本的配置文件外,还可以用在国际化上面,跟values的国际化效果相同(没经过验证,实际应用中需要慎重)。可以用来存储一些简单的配置。
在Android里面properties相关类有以下几个:
java.util.Properties
java.util.ResourceBundle (抽象类)
java.util.PropertyResourceBundle
使用Properties类读取properties比较灵活,而且可以对properties内容进行修改,但是路径不好获取(android上的路径和电脑上的路径不一样,自己在sd卡创建的properties和assets中的文件会使用简单点。与其这样还不如使用yaml文件进行配置存储
snake-yaml: github:https://github.com/bmoliveira/snake-yaml
yaml使用文档:https://bitbucket.org/asomov/snakeyaml/wiki/Documentation
),而且有个api性能很差,所以这里不予考虑。除非不使用以下方式:
ClassLoader.getResourceAsStream:
http://www.imooc.com/article/257124
Android官方对properties有个专门的位置进行存储。本篇着重考虑该种方式:
通过该方式创建resources文件夹
默认没有文件
执行下个步骤创建Resources Bundle文件
选择后会出现下面对话框:
选择xml的话是用xml形式存储配置,这个好处是字符集范围比properties大点,不好就是写起来比较麻烦,暂时没研究这个。使用默认的properties文件。另外zh这个是自己添加的。格式需要根据国际规定编写
,本篇暂时不涉及。在只有Default locale时候,创建的properties文件在resources文件夹根目录下面。如果是国际化的话会单独创建新的文件夹,把该类properties文件全部放入到这个文件夹下面,示例如下:
创建的properties文件默认是空白的,需要进行定义内容,这里定义内容如下:
注意key和value都是字符串,不管定义成什么样子
在程序中取值方式如下:
这里使用的是kotlin的方式写的,Java需要修改下。
另外properties对中文支持不好,需要修改下Android Studio的配置:
如果不想修改配置的话,需要把中文写成urlEncode编码才可以读出正常的内容