1. 明确模块分工
将项目按职能分工,划分不同的 Module ,比如
- app 业务模块
- annotations 注解模块
- compiler 编译模块
- core 核心模块
- ec 其他模块
注意:这些模块要按照业务需要,依赖不同的库。如果需要使用标准 Java 中的一些类文件,则需要指定为 Java Library ,如果只需要使用 Android 中的类文件,则指定为 Android Library 。
2. 简化依赖关系
Module 与 Module 之间存在依赖明确的依赖关系,那么在 build.gradle 中的依赖声明能够简化的要简化。
比如, ec 依赖了 core ,那么 ec 中与 core 重复的依赖声明均可以删除掉。
3. 优化配置初始化参数
一般来说,配置参数都会在 Application 的子类的 onCreate() 方法中声明,但这种方法复杂且麻烦,下面介绍一种简单的方法。
新建一个类用于存储和管理所有的配置参数。所有的参数初始化只需要调用这个类暴露的接口方法即可达到目的。
这个类(Configurator)需要做到以下几点:
- 返回 Configurator 实例(单例模式保证线程安全)
- 使用 HashMap 以键-值的方式存储所有的配置参数,并提供 get 和 set 方法
- 暴露初始化配置参数的方法
- 暴露配置参数是否初始化完成的状态查询方法
代码示例如下(实际操作中将这个类拆成了三个类):
ConfigType.java
package com.thorn.milk.app; /** * 1. enum 修饰的枚举类 * 2. 特点:整个程序里面保证唯一的单例,只能被初始化一次,在进行多线程操作时使用,是一种多线程安全的懒汉模式 */ public enum ConfigType { API_HOST, APPLICATION_CONTEXT, CONFIG_READY, ICON }
Configurator.java
package com.thorn.milk.app; import java.util.HashMap; /** * Created by pengj on 2018-7-13. * Github https://github.com/ThornFUN * Function: * 提醒:尽量让变量具有不可变性(使用 final 修饰),一个避免误修改,二个可以提升性能 */ public class Configurator { private static final HashMap<String, Object> MILK_CONFIGS = new HashMap<>(); private Configurator() { MILK_CONFIGS.put(ConfigType.CONFIG_READY.name(), false); } /* * 1. 返回 Configurator 实例,使用懒汉模型的单例模式,静态内部类方式实现 * */ private static class Holder { private static final Configurator INSTANCE = new Configurator(); } public static Configurator getInstance() { return Holder.INSTANCE; } /* * 2. 返回存储 Configurations 的 Map 实例, * */ public static HashMap<String, Object> getMilkConfigs() { return MILK_CONFIGS; } /* * 3. 暴露外部调用的方法,以作初始化记录 * */ public final void configure() { MILK_CONFIGS.put(ConfigType.CONFIG_READY.name(), true); } /* * 4. 传入 ApiHost 初始化数据 * */ public final Configurator withApiHost(String host) { MILK_CONFIGS.put(ConfigType.API_HOST.name(), host); return this;//将原对象添加属性后,重新赋值回去 } /* * 5. 从 Map 中获取指定 ConfigType 的 Object 的值 * */ @SuppressWarnings("unchecked") final <T> T getConfigurations(Enum<ConfigType> key) { checkConfigration(); return (T) MILK_CONFIGS.get(key); } public final void checkConfigration() { final boolean isReady = (boolean) MILK_CONFIGS.get(ConfigType.CONFIG_READY.name()); if (!isReady) { throw new RuntimeException("Config is not ready,call configure"); } } }
Milk.java
package com.thorn.milk.app; import android.content.Context; import java.util.HashMap; /** * Created by pengj on 2018-7-13. * Github https://github.com/ThornFUN * Function: */ public final class Milk { public static Configurator init(Context context){ getConfigurations().put(ConfigType.APPLICATION_CONTEXT.name(),context.getApplicationContext()); return Configurator.getInstance(); } private static HashMap<String,Object> getConfigurations(){ return Configurator.getInstance().getMilkConfigs(); } }
那么 Application 中调用如下:
public class FastECApplication extends Application { @Override public void onCreate() { super.onCreate(); Milk.init(getApplicationContext()) .withApiHost("这里写服务器地址") .configure(); } }