注意不要编写返回引用可变对象的访问器方法

在看《Java核心技术(原书第9版中文版)》的时候,看到113页的一个警告,“注意不要编写返回引用可变对象访问方法”。以前没看到过,原来Date对象可变对象。就可变对象这个概念,查了一下网,我认为可变对象,就是在类中可以不通过域更改器方法就能改变值的对象

 1 package com.csst.sort;
 2
 3 import java.util.Date;
 4 import java.util.GregorianCalendar;
 5
 6 public class Employee {
 7     private String name;
 8     private double salary;
 9     private Date hireDay;
10
11     public Employee(String n, double s, int year, int month, int day) {
12         name = n;
13         salary = s;
14         GregorianCalendar Calendar = new GregorianCalendar(year, month - 1, day);
15         hireDay = (Date) Calendar.getTime();
16     }
17
18     public static void main(String[] args) {
19
20         Employee employee = new Employee("lele", 600, 1994, 10, 24);
21
22         Date date = employee.getHireDay();
23         System.out.println(date);
24
25         date.setTime(2000500000);
26       
27         System.out.println(date);
28         System.out.println(employee.getHireDay());
29     }
30
31     public void raiseSalary(double byPercent) {
32         double raise = this.salary * byPercent / 100;
33         salary = this.salary + raise;
34     }
35
36     public String getName() {
37         return name;
38     }
39
40     public void setName(String name) {
41         this.name = name;
42     }
43
44     public double getSalary() {
45         return salary;
46     }
47
48     public void setSalary(double salary) {
49         this.salary = salary;
50     }
51
52     public Date getHireDay() {
53         return hireDay;
54     }
55
56     public void setHireDay(Date hireDay) {
57         this.hireDay = hireDay;
58     }
59
60 }

最终结果:

Mon Oct 24 00:00:00 CST 1994
Sat Jan 24 11:41:40 CST 1970
Sat Jan 24 11:41:40 CST 1970

说明hireDay已经改变,将其get方法改为

public Date getHireDay() {
		return (Date) hireDay.clone();
	}

  结果为:

Mon Oct 24 00:00:00 CST 1994
Sat Jan 24 11:41:40 CST 1970
Mon Oct 24 00:00:00 CST 1994

时间: 2024-10-09 05:30:08

注意不要编写返回引用可变对象的访问器方法的相关文章

返回引用和对象遇到的坑

在leet code上做题遇到了一个坑,算法总认为自己写得没有问题,处理流程造就烂熟于心,用X code调试发现还是疏忽了:C++返回引用和返回对象的差别,在一个函数结束的地方返回了一个临时对象的引用! 根据以往的经验,引用是C++程序中高效能的法宝,节省了对象复制拷贝时的开销,但是滥用引用也会导致意想不到的错误.例如以下的代码: // 从一个字符串中,从后向前查找一个单词 // @s 源字符串// @index : 查找字符串起始位置的脚标// 返回查找得到的单词,没有找到单词时返回一个含有空

应网友的要求写的一个 对象属性访问器的判断

function Person(name) { this.name = name; this.flag = 0; Object.defineProperty(this, 'name', { get: function() { return name;}, set: function(newName) { if (this.flag) { name = newName; this.flag = 0; } return name; } }); this.setName = function(newN

java-并发-不可变对象

当一个对象创建后的状态不可改变时就认为其为不可变对象,尽可能地利用不可变对象被公认为是构建简单可靠代码的有效方法.不可变对象在并发程序中比较有用,由于其状态无法改变,因此无法被线程的干扰损坏或者被视为不一致状态. 程序员一般不愿意使用不可变对象,因为他们担心创建一个新对象可能会比更新一个已有对象的状态代价更大,然而往往创建一个对象的影响会被高估,而且会被与不可变对象相关的高效性补偿,这包括降低垃圾回收的开支,免除需要防止可变对象被损坏的代码. 不可变对象语法上没有新的内容,以下定义了一些创建不可

java基础---不可变对象创建

通过反射还是可以修改的. public static void stringReflection() throws Exception { String s = "Hello World"; System.out.println("s = " + s); //Hello World //获取String类中的value字段 Field valueField = String.class.getDeclaredField("value"); //改

Javascript常用对象的属性和方法

javascript为我们提供了一些非常有用的常用内部对象和方法.用户不需要用脚本来实现这些功能.这正是基于对象编程的真正目的. 在javascript提供了string(字符串).math(数值计算)和Date(日期)三种对象和其它一些相关的方法.从而为编程人员快速开发强大的脚本程序提供了非常有利的条件. 1.常用内部对象 在javascript中对于对象属性与方法的引用,有两种情况:其一是说该对象是静态对象,即在引用该对象的属性或方法时不需要为它创建实例:而另一种对象则在引用它的对象或方法是

JavaScript对象就是一组属性(方法)的集合

在JavaScript中,每个对象可以看作是多个属性(方法)的集合,引用一个属性(方法) 很简单,即: 对象名.属性(方法)名 除此之外,还可以用方括号的形式来引用: 对象名[“属性(方法)名”] 注意,这里的方法名和属性名是一个字符串,而非原先点号后面的标识符,例如: var arr=new Array(); //为数组添加一个元素 arr[“push”](“abc”); //获得数组的长度 var len=arr[“length”]; //输出数组的长度 alert(len); 图4.1 显

Python 获取对象的属性和方法—dir 函数

工作中,我们使用一些之前没用到过的模块,使用时需要了解一下这个模块中的一些类的方法或属性,怎么做呢?目前我比较常用的两款IDE“Pycharm”和“VSCode”,都可以通过先导包,然后通过“Ctrl+鼠标左键”,进入源码后观看并膜拜一下大神们的代码,当然也可以进入我们在项目中自己所定义的,然后进行快速修改,真的是很方便呢.但是有的时候,我们使用的环境没有这类的IDE,那该怎么学习我们要用的这些类方法和属性呢?方法当然很多,无论是小白,还是大神,百度谷歌大法都是比较快速和方便的.但是对于一些刚开

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):当函数返回一个局部对象时,虽然这个对象已经释放,但是返回时会产生一个临时的对象.而当返回一个局部对象的引用时,这个对象已经不存在了.这就要求在函数参数中,包含一个引用或指针.int &func(int a,int b,int &retsult){ retsult = a + b; return &retsult}但是如下代码是错误的(返回局部对象的引用)int &func(int a,int b){ int &

基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. 百度和网页 http://bbs.csdn.net/topics/380238133 的作者无关,不对其内容负责.百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面. 首页 精选版块 移动开发 iOS Android Qt WP 云计算 IaaS Pass/SaaS 分布式计算/Hadoop J