java核心:不要编写返回引用可变对象的访问器方法

package corejava;

import static java.lang.Math.*;

import java.io.IOException;
import java.math.*;
import java.nio.file.Paths;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class CoreJava {

	public static void main(String[] args) throws IOException {
		// Scanner in=new Scanner(Paths.get("in.txt"),"utf-8");
		Emplee harry = new Emplee(2020, 8, 26);
		Date d = harry.gethireday();
		double ten = 10 * 365 * 24 * 60 * 60 * 1000;
		d.setTime(d.getTime() - (long) ten);
		System.out.println(d);
		System.out.println(harry.gethireday());
	}
}

class Emplee {
	public Emplee(int year, int month, int day) {
		// TODO Auto-generated constructor stub
		GregorianCalendar c = new GregorianCalendar(year, month, day);
		hireday = c.getTime();
	}

	private Date hireday;
//
//	public Date gethireday() {
//		return (Date) hireday.clone();
//	}
	
	public Date gethireday()
	{
		return hireday;
	}
}

如果Emplee类的gethireday方法如下:

public Date gethireday()
	{
		return hireday;
	}

则会改变Emplee的变量hireday。

 这是不对的,date对象是可变的,这破坏了封装性!

应该是:需要返回可变对象的引用时,先进行克隆,克隆的对象放在另一个位置上,改变的时候不会影响本来的值。d和harry.hireday引用同一个对象,所以对d改变是影响了hireday私有变量。

public Date gethireday() {
		return (Date) hireday.clone();//需要返回可变对象的引用时,先进行克隆,克隆的对象放在另一个位置上,改变的时候不会影响本来的值。d和harry.hireday引用同一个对象,所以对d改变是影响了hireday私有变量。
	}

结果:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值