工具的保护——权限修饰符
首先对于工具的设计理念:工具不仅是为了完成当下的项目开发而设计的,更应该从“未来可再次使用”的角度思考
在数据结构与算法的学习中,在表达式时讲到了对工具内部的保护,定义的结构体我们并不想要用户直接用struct.abc来修改结构体内部数据,但是C语言并没有提供相应的功能。
但是java提供了三个权限修饰符:public、protected、private
public:其修饰的成员与方法,可以在类外任意访问(读/写)
private:其修饰的成员和方法,只能在类的内部进行访问
基于上面,对SimplePoint进行一些修改:
class SimplePoint{
private int row;
private int col;
public void printPoint() {
System.out.println("(" + row + ", " + col + ")");
}
public void moveTo(int newRow, int newCol) {
row = newRow;
col = newCol;
}
}
当程序在row,col前加了private之后,用户就无法用pointOne.row = 3;
对类的成员直接赋值了
但是对应的,想要把row,col投入使用,我们需要新增对其值进行更改的函数(方法):
class SimplePoint{
private int row;
private int col;
public void setRow(int x) {
row = x;
}
public int getRow() {
return row;
}
public void setCol(int y) {
col = y;
}
public int getCol() {
return col;
}
public void printPoint() {
System.out.println("(" + row + ", " + col + ")");
}
public void moveTo(int newRow, int newCol) {
row = newRow;
col = newCol;
}
}
通过上面的修改,不难看出类的成员已经被保护起来了,只能由方法对其进行赋值、获取。
接下来对调用也进行一些修改:
class DemoSimplePoint{
public static void main(String[] args) {
SimplePoint pointOne = new SimplePoint();
pointOne.setRow(3);
pointOne.setCol(4);
pointOne.printPoint();
pointOne.moveTo(13, 2);
pointOne.printPoint();
}
}
通常情况下,类的成员都需要private的保护,而类的方法都是public的,以便公开调用
工具要合理更要合情
重新审视一下上面对于工具保护的修改,虽然这样成员被保护起来了,只能通过方法进行访问,但实际上真的有必要么?
此外,因为程序基于屏幕点坐标管理,行、列都有限制:25行,80列
故我们的row和col成员的值存在有效取值范围。
因此在方法中,通过setRow()和setCol()可以增加“对用户赋值操作进行‘监控’的代码和逻辑”,从而保证row和col成员的值合情合理
如下:
public void setRow(int x) {
if (x <= 0 || x >= 25) {
x = 1;
}
row = x;
}
public void setCol(int y) {
if (y <= 0 || y >= 80) {
y = 1;
}
col = y;
}
其中x = 1; y = 1;的1是在有效值范围内随意取的,即为“默认值”