effective java(14) 之在公有类中使用访问方法而非公有域

effective java 之在公有类中使用访问方法而非公有域


1、如何理解这句话:
我们不能这样做,
Class Point {
public double x;
public double y;
}

Point类的数据域是可以直接被访问的,这样的类没有提供封装。
如果不改变API,就无法改变它的数据表示法(比如,使用一个比double更高精度的类来表示x和y),也无法强加任何约束条件(比如以后我们可能会希望x和y不会超过某个值)。


如何做?应该这样
	Class Point {
		private double x;
		private double y;
		//构造方法
		public Point(double x, double y) {
			this.x = x;
			this.y = y;
		}

		public double getX() { return x; }
		public double getY() { return y; }

		public void setX(double x) { this.x = x; }
		public void setY(double y) { this.y = y; }
	}

2、使用私有域和公有访问方法的公有类是比较合适的。在它所在的包的外部访问时,提供访问方法,以保留将来改变该类的内部表示法的灵活性。

3、让公有类暴露域不是好办法,但如果域是不可变的,这种做法的危害会较小
	public final class Time {
		private static final int HOURS_PER_DAY = 24;
		private static final int MINUTES_PER_HOURS = 60;


		public final int hour;// hour是不可变域
		public final int minute;// minute是不可变域


		public Time(int hour, int minute) {
			// 无法改变类的表示法,但是可以强加约束条件
			if (hour < 0 || hour > HOURS_PER_DAY)
				throw new IllegalArgumentException("Hour: " + hour);
			if (minute < 0 || minute >= MINUTES_PER_HOUR)
				throw new IllIllegalArgumentException("Minute: " + minute);
			this.hour = hour;
			this.minute = minte;
		}
	}

只有初始化的时候可以为hour和minute域赋值,其他的方法或者外部类都不能修改这两个域。

4、公有类永远都不应该暴露可变的域。

虽然还是有问题,但是让公有类暴露不可变的域其危害比较小。但是,有时候会需要用包级私有的或者私有的嵌套类来暴露域,无论这个类是可变还是不可变的。


每天努力一点,每天都在进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

powerfuler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值