Java类属性private及get/set方法之个人见解

Java类属性private及get/set方法之个人见解

引言(问题引出)

大二刚学Java的时候,学到属性类型这一的时候,老师是说如果你的某个属性(字段)牵扯到比较重要的东西不希望别人修改,就把它设为private,这样别人拿到你的这个对象,也改不了其中的私有字段的内容。

后来老师又讲到了为类生成get和set方法,可以通过eclipse的快捷键Alt+Shift+S -> generate getters and setters来生成。这使我产生了一些疑惑:既然属性是私有不想被别人访问修改,那为什么getset方法是public的呢,直接把字段设为public不就完了吗?

由于最近时间比较多,闲着没事就爱瞎琢磨,所以在此分享一下我个人的一些看法。

思想指导——正义:设计上做到安全

什么叫设计上做到安全呢?前面我所遇到的困惑其实完全是杞人忧天,人家作者的设计完全就是从安全角度考虑的。下面先通过几个通俗的例子引入。

  1. 钱包例子(从被访问/修改者角度):你有一个钱包,里面有很多钱,现在你把他放在一个人很多的广场中央。从社会生活的角度出发,这个钱包完全是你私有的(private),你不能直接将其暴露在公众面前。而现在它却暴露在了人们面前(public-别人可以随意查看里面的金额,可以随便拿走里面的钱)。 ***** 这个时候你说:无所谓啊,我就是喜欢把自己的前分享给大家,难道不行吗?哈哈哈,事实上,这完全没有什么问题,你有权力处理自己的合法财产(为违背正义)。可是,对于随便拿你钱的人来说,他们的行为完全是不正义的,因为我们不能提倡看到别人的东西在大街上就随意拿走。所以在设计上要想做到安全,需要做到别人对你的private属性不能进行访问和修改(事实上,这里应该是不能直接访问和直接修改,但是在这里只能得出括号前的结论,括号内的结论需要到后面才能得出,请继续往下看)

    这个时候你可能很不开心:我就是一个热爱奉献的人啊,我喜欢把自己的钱分享给别人,这有什么不对吗?这其实没有什么不对,但是这可能把他人置于危险的境地,让一部分人认为别人就应该把自己的财产分享给自己。但是这个问题可不可以解决呢,完全可以!你可以挂一个牌子,上书“有钱请联系XXX,电话XXXXXXX”。这样一来你既可以发散内心的良善,又可以避免他人随意动你的财产。
    这就相当于你不直接将钱暴露在公众面前,而是只暴露一个接口(get set方法)。那么如此一来,即使是别人找你要钱,决定权也掌握在你手里。有人说你直接把你整个钱包给我吧,你也可以给他,其他人跟你要钱你就给,要多少给多少,谁都不拒绝,这样也完全没问题。因为危险掌握在你自己手中,或者说有危险也完全是你自己给自己带来的,一切都掌握在自己手中。
    另一方面,通过get和set方法,也并非是等同于允许别人直接访问和修改你的数据。你可以通过参数来决定返回给别人的具体内容,比如我跟你要钱,我的颜值就可以作为一个参数。本人颜值爆表,我问你要多少钱,你就可以如实告诉我(return this.money),我要你所有的钱(set你的money为0),你一看这么高的颜值,那你就走this.money=money代码。来了一个人颜值一般,就this.money=money*9/10(留9/10,只给1/10)。来一个千年大马猴,问你有多少钱,就直接return 0.0,一分没有【doge】。
    这样是不是就实现了安全(正义),我要你钱可以,全要也没事,但是必须跟你打招呼,你做出的一切抉择即使存在危险那也是可以接受和容忍的,因为这是由你自己给自己带来的,一切掌握在你自己手中

/**

  • 富翁实体类

*/
public class RichMan {

private Double money;

public RichMan(Double money) {
	this.money = money;
}

public Double getMoney(Borrower borrower) {
	if (borrower.getYanZhi() >= 90) {
		return money;
	} else if(borrower.getYanZhi() >= 60 && borrower.getYanZhi() < 90) {
		return money * 0.5;
	} else {
		return 0.0;
	}
}

public void setMoney(Double money) {
	this.money = money;
}

}

在这里插入代码片
/**
 * 借钱人实体类
 *
 */
public class Borrower {
	
	private Integer yanZhi;
	
	public Borrower(Integer yanZhi) {
		this.yanZhi = yanZhi;
	}

	public Integer getYanZhi() {
		return yanZhi * 2;
	}

	public void setYanZhi(Integer yanZhi) {
		this.yanZhi = yanZhi;
	}

}

在这里插入图片描述

  1. 追女孩例子(从访问/修改别人数据者角度):你是一个巫师,还是那种比较罕见的心灵巫师(可以控制人的心灵***ps:本人最近在玩一款汉家松鼠的独立游戏——部落与弯刀,推荐大家也玩一下)。扯远了,你是一个心里巫师,追女孩子的时候完全可以直接控制她爱上你。但这样就完全失去了意义,这不是真爱,而且你也剥夺了她的权利,违背了正义
    但是你却是一个善良的巫师,你即使有直接控制他人的能力,你也不随便使用,你还是选择去走女孩暴露给你的get和set方法。你天天给她做饭,陪她玩,逗她开心。**你真真实实地去爱他守护她,而这一切相当于量化地参数,当达到一定程度,她就会被你打动爱上你。**在她的set方法里,经过对你这么长时间的考验和观察,她心甘情愿的在自己的set方法里,执行this.husband=XXX(你)。这可能就是get set方法的真正用途吧。
  2. 买票杀熟例子(纯属虚构,不针对任何个人和组织):eclipse生成的get和set方法是默认的,因为我们的业务规则千奇百怪,所以官方默认生成的都是简单粗暴的直接访问和修改,我们可以根据具体需求进行修改
    现在有用户买票,那么用户就可以作为一个参数传入,先判断是不是熟用户,是的话用户查询票价(get)的时候就 return this.currentPrice*1.05。
  3. 具体的例子:我们创建了一个长方体的类,字段有长、宽、高、体积,那么getVolume方法的返回值必定是根据长宽高计算得出的。或者不设置体积字段,只需要一个getVolume即可。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值