Print工具类
这篇文章已经废弃。
实际开发中,打印信息只会用日志框架(Log4j2)。
受到Thinking in Java中静态引入(import static)的启发,
Deolin也打算写一个方便自己的工具类,先从最简单的打印开始。
为了方便日后管理,代码以类库“commons-simplify”的形式托管到了Github。
工具类主要利用了 根据参数编译期的类型来选择哪个重载方法 的原理。
作用是省去了诸如System.out.println() 和System.out.print() 这类的模块代码,
顺便还兼顾了数组、Collection、Map中的遍历打印。
以下是测试类,工具类覆盖了测试类中出现的所有情况,基本上也是日常开发中最常见的需要打印的情况。
1 import static io.deolin.commons.simplify.Print.*; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.HashMap; 6 import java.util.List; 7 import java.util.Map; 8 9 public class PrintTest { 10 11 private static List<String> c = new ArrayList<String>(Arrays.asList("c1", "c2", "c3")); 12 13 private static String[] a = { "a1", "a2", "a3" }; 14 15 private static Map<String, String> m = new HashMap<String, String>(); 16 17 private static HashMap<String, String> hm = new HashMap<String, String>(); 18 19 static { 20 m.put("k1", "v1"); 21 m.put("k2", "v2"); 22 m.put("k3", "v3"); 23 hm.put("k11", "v11"); 24 hm.put("k22", "v22"); 25 hm.put("k33", "v33"); 26 } 27 28 private static char[] pa1 = { 101, 102 }; 29 30 private static boolean[] pa2 = { false, true }; 31 32 private static byte[] pa3 = { 1, 2 }; 33 34 private static short[] pa4 = { 99, 98 }; 35 36 private static int[] pa5 = { 111111, 222222 }; 37 38 private static long[] pa6 = { 123456789L, 987654321L }; 39 40 private static float[] pa7 = { 1.0F, 2.0F }; 41 42 private static double[] pa8 = { 1234.56789F, 9876.54321F }; 43 44 public static void main(String[] args) { 45 p(); 46 p(12); 47 p("a"); 48 p(a); 49 p(pa1);p(pa2);p(pa3);p(pa4);p(pa5);p(pa6);p(pa7);p(pa8); 50 p(c); 51 p(m); 52 p(hm); 53 ln(12); 54 ln("a"); 55 ln(a); 56 ln(pa1);p();ln(pa2);p();ln(pa3);p();ln(pa4);p();ln(pa5);p();ln(pa6);p();ln(pa7);p();ln(pa8);p(); 57 ln(c); 58 ln(m); 59 ln(hm); 60 } 61 62 }
根据参数编译期的类型来选择哪个重载方法
class A {} class B extends A {} class C extends B {} class Demo { public static void main(String[] args) { A ac = new C(); B bc = new C(); C cc = new C(); method(ac); method(bc); method(cc); } static void method(A a) { p("You are a A"); } static void method(B b) { p("You are a B"); } static void method(C c) { p("You are a C"); } }
You are a A
You are a B
You are a C
1、如果把方法method(A a)注释掉,那么method(ac)编译出错,因为'A' IS-NOT-A 'B'而且 'A' IS-NOT-A 'C',
除非再定义一个方法method(Object a),不然ac引用将没有方法可选,引起编译报错。
2、如果把方法method(C c)注释掉,什么都不会发生,但是运行结果改变了
You are a A
You are a B
You are a B
和1、中的ac引用类似,cc也失去了对口的重载方法,但是由于'C' IS-A 'B',
所以method(cc)中,‘C cc’先向上转型成了‘B cc’,然后进入了方法method(B b),打印了“You are a B”。