`
李灵晖-raylee
  • 浏览: 130143 次
博客专栏
Group-logo
从头认识java
浏览量:0
文章分类
社区版块
存档分类
最新评论

java基础入门-数据访问器(set方法)与返回可变对象

 
阅读更多

今天写一个大家平常都比较忽略的一个问题

set方法与返回可变对象

我们平常在编程的时候,大部分的时候都是使用get、set方法来访问或者设置属性域

但是在set的方法当中会出现一些比较特殊的例子,就像下面的代码,

birthday手型,在set方法里面返回的是一个可变对象date,然后我们再通过这个date去改变属性域里面的值

这种错误时经常出现在代码里面,正确的做法是在birthday的set方法里面加入clone方法,这样就保证了属性域的不可操作性



package com.ray.object;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 数据访问器(set方法)与可变对象
 * 
 * @author ray
 * @since 2015-04-22
 * @version 1.0
 * 
 */
public class Person {

	private Date birthday = new Date();

	// 注意:这里返回的是可变对象
	public Date getBirthday() {
		return birthday;
	}

	public static void main(String[] args) throws Exception {
		Person bill = new Person();
		System.out.println(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
				.format(bill.getBirthday()));
		Date birthday = bill.getBirthday();
		Thread.sleep(2000);
		birthday.setTime(System.currentTimeMillis());
		System.out.println(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
				.format(bill.getBirthday()));
	}
}

输出:

2015-04-27 09:23:29
2015-04-27 09:23:31


正确的代码:

package com.ray.object;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 数据访问器(set方法)与可变对象
 * 
 * @author ray
 * @since 2015-04-22
 * @version 1.0
 * 
 */
public class Person {

	private Date birthday = new Date();

	// 注意:这里返回的是可变对象
	public Date getBirthday() {
		return (Date) birthday.clone();
	}

	public static void main(String[] args) throws Exception {
		Person bill = new Person();
		System.out.println(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
				.format(bill.getBirthday()));
		Date birthday = bill.getBirthday();
		Thread.sleep(2000);
		birthday.setTime(System.currentTimeMillis());
		System.out.println(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
				.format(bill.getBirthday()));
	}
}

输出:

2015-04-27 09:25:36
2015-04-27 09:25:36


版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 ...

    AIC的Java课程1-6章

     能够定义类,创建类的对象(实例化类)和通过对象引用访问数据成员和方法成员;形成定义类和使用类的两种不同的思维方式。  理解构造函数的作用(分配对象空间),理解和定义重载的构造函数。  明白...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 ...

    疯狂JAVA讲义

    5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生提问:为什么方法的返回值类型不能用于区分重载的方法? 124 5.3 成员变量和局部变量 124 5.3.1 成员变量和局部变量 125 5.3.2 成员...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. ...

    HibernateAPI中文版.chm

    4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. ...

    hibernate3.2中文文档(chm格式)

    4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. ...

    informix 实用大全

    15.4 数据操纵与访问命令 15.5 优化命令 15.6 信息性命令 15.7 更多信息 15.8 informix与其他参考资料 第16章 informix dynamic server 7.30特性改进 16.1 可靠性、可用性与服务性 16.2 性能 16.3 ...

    hibernate3.04中文文档.chm

    5.1.1. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators) 5.1.2. 实现一个默认的(即无参数的)构造方法(constructor) 5.1.3. 提供一个标识属性(identifier property)(可选) 5.1.4. 使用非...

    Hibernate中文详细学习文档

    4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. ...

    Hibernate教程

    5.1.1. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators) 5.1.2. 实现一个默认的(即无参数的)构造方法(constructor) 5.1.3. 提供一个标识属性(identifier property)(可选) 5.1.4. 使用非...

    ZendFramework中文文档

    7.3.3. 环境访问器方法 7.3.4. 前端控制器参数 7.3.5. 继承前端控制器 7.4. 请求对象 7.4.1. 介绍 7.4.2. HTTP 请求 7.4.2.1. 访问请求数据 7.4.2.2. 基地址和子目录 7.4.2.3. 决定请求方式 7.4.2.4. 删除 ...

Global site tag (gtag.js) - Google Analytics