Log类的设计

正式代码设计之前我们先考虑一下日志类的使用。

日志主要用在调试app 一些复杂的业务流程,借助log 可以很容易找到问题所在

因为android.util.Log 定义为final类(不可继承) 所以我采用组合的方式才重写一个可以控制开关的日志工具类。考虑到Log应用的广泛性,所以定义为static,生命周期为全局

  1. public class Log {
  2. /**
  3. * 日志的开关, false 表示不打印日志
  4. */
  5. private static boolean open = false;
  6. public static boolean isOpen() {
  7. return open;
  8. }
  9. public static void setOpen(boolean open) {
  10. Log.open = open;
  11. }

Log的开关控制,一般在app初始化的地方设置。后续再讨论

  1. public static void d(String tag, String msg){
  2. if(open == false){
  3. return; // 不打印日志
  4. }
  5. android.util.Log.d(tag,msg);
  6. }

其中tag和msg 考虑到传入的参数需要频繁转型

比如说像打印一个int型的变量值。这时候会很不方便。同理其他非String类型的都需要转化为String 。

因为优化一下当前方法

  1. public static voidd(Object tag, Object msg){
  2. if(open == false){
  3. return; // 不打印日志
  4. }
  5. android.util.Log.d(String.valueOf(tag), String.valueOf(msg));
  6. }

这时候如果传入的 tag == null 或者“” 或者 包含有” ” \n\r等字符 ,那么输出的结果可能不是我们想要的,

接着继续优化一下该方法

  1. package phoebe.frame.util;
  2. /**
  3. * 日志打印
  4. *
  5. * @author coffee <br>
  6. *
  7. * 2015-12-16 下午9:39:41
  8. */
  9. public class Log {
  10. /**
  11. * 日志的开关, false 表示不打印日志
  12. */
  13. private static boolean open = false;
  14. public static boolean isOpen() {
  15. return open;
  16. }
  17. public static void setOpen(boolean open) {
  18. Log.open = open;
  19. }
  20. public static void d(Object tag, Object msg) {
  21. if (open == false) {
  22. return;
  23. }
  24. tag = handleMsgOrTag(tag);
  25. msg = handleMsgOrTag(msg);
  26. android.util.Log.d(String.valueOf(tag), String.valueOf(msg));
  27. }
  28. private static Object handleMsgOrTag(Object msgOrTag) {
  29. if (msgOrTag == null) {
  30. msgOrTag = "[null]";
  31. } else if (msgOrTag.toString().trim().length() == 0) {
  32. msgOrTag = "[\"\"]";
  33. } else {
  34. msgOrTag = msgOrTag.toString().trim();
  35. }
  36. return msgOrTag;
  37. }
  38. }
  39.