首页 > 代码库 > Print工具类

Print工具类

受到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”。

 

Print工具类