15-工具类的设计

在类的设计中,可以利用构造方法private化和成员方法static化来设计一个工具类。下面给出一个例子:

首先是按照常规类设计的情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class  {    

public () { //未使用private关键字
}

//成员方法
public int add(int a, int b) { //未使用static关键字
return a + b;
}
}

class MyMathDemo {
public static void main(String[] args) {
int a = 4;
int b = 3;
System.out.println("a + b = " + MyMath.add(a, b)); //ERROR
System.out.println("---------------");
MyMath myMath = new MyMath();
System.out.println("a + b = " + myMath.add(a, b)); //OK
}
}

上面的代码定义了一个简易数学类(MyMath)和一个简易数学类的测试类(MyMathDemo)。在MyMath类中没有实例域。在MyMathDemo类中测试了MyMath类的方法add(int, int)。

按照常规类设计时,不能直接通过类名来访问类的方法,只能先创建一个类的对象,再通过对象访问类的方法。因为在这个类中没有实例域,只有方法,所以创建对象没任何意义,还占用内存。

此时,遇到 MyMath.add编译会报错。遇到myMath.add编译不会报错。


改良版

对于这种“问题”,可以通过static关键字来有效避免。现在给MyMath类的方法加上关键字static:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class  {    

public () { //未使用private关键字
}

//成员方法
public static int add(int a, int b) { //使用static关键字
return a + b;
}
}

class MyMathDemo {
public static void main(String[] args) {
int a = 4;
int b = 3;
System.out.println("a + b = " + MyMath.add(a, b)); //OK
System.out.println("---------------");
MyMath myMath = new MyMath();
System.out.println("a + b = " + myMath.add(a, b)); //OK
}
}

方法使用了static关键字时,就变成了一个静态方法。这时候,可以直接通过类名调用这个方法。

此时,遇到 MyMath.add编译不会报错。遇到myMath.add编译也不会报错。


最终版

虽然上面通过static关键字有效实现了不再需要创建对象,直接通过类名就能访问这个方法。但同时也带来了一个问题,那就是程序并没有屏蔽创建对象的入口,在上面的代码中,我们仍然可以创建一个MyMath类的对象,再通过该对象访问MyMath类的方法。这时候,我们可以给构造方法加上private关键字来屏蔽创建对象的入口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class  {    

private MyMath() { //使用private关键字
}

//成员方法
public static int add(int a, int b) {
return a + b;
}
}

class MyMathDemo {
public static void main(String[] args) {
int a = 4;
int b = 3;
System.out.println("a + b = " + MyMath.add(a, b)); //OK
System.out.println("---------------");
MyMath myMath = new MyMath(); //ERROR
System.out.println("a + b = " + myMath.add(a, b));
}
}

使用了private关键字时,只能被自己类的方法访问,而不能被其他类的任何方法访问。这里给MyMath类的构造方法MyMath()加上private关键字后,就不能在MyMathDemo类中通过MyMath类的构造方法MyMath()来创建MyMath类的对象了。

此时,遇到MyMath.add编译不会报错。遇到MyMath()编译会报错。

至此,我们利用构造方法private化和成员方法static化简单实现了一个工具类。

原文:大专栏  15-工具类的设计


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11584795.html