今天写一个大家平常都比较忽略的一个问题
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语言程序设计(Java7)入门与提高篇》是一本专为初学者和有一定基础的程序员设计的书籍,旨在帮助读者深入理解Java编程语言,并通过实际操作提升编程技能。这本书涵盖的内容广泛,从基础语法到高级特性,全...
Java语言基础是学习Java编程的入门阶段,涵盖了变量、数据类型、运算符、控制结构、类和对象等基本概念。以下是一些关于Java语言基础的关键知识点: 1. **变量和数据类型**:Java提供了基本数据类型(如int、char、...
- **String类**:Java中的字符串是不可变的,提供了丰富的操作方法。 - **StringBuilder与StringBuffer**:在需要频繁修改字符串时,这两个类更为高效。 **5. 异常处理** - **异常处理机制**:Java使用try-catch-...
### Java入门学习笔记 #### 一、Java特点与运行原理 **1.1 Java特点** - **简单性:** Java的设计使得它易于学习且避免了许多传统编程语言中存在的复杂性。 - **面向对象:** Java是一种纯面向对象的语言,支持...
- **常量**:在Java中,常量是不可变的值,分为整型、浮点型、字符型、布尔型以及字符串常量。命名规则遵循一定的规范,如类名首字母大写,常量全大写并用下划线分隔。 2. **注释**: - **单行注释**:以`//`开始...
- `String` 类在 Java 中表示不可变的字符序列。 - 为了提高效率节省内存空间,在频繁修改字符串时应该使用 `StringBuilder` 或 `StringBuffer`。 #### 11. int 与 Integer 类型 - `int` 是 Java 的基本数据类型之...
- **不可变集合**:通过`Collections.unmodifiableList()`等方法可以创建不可变集合,确保集合内容不会被意外修改。 - **泛型类型安全性**:自Java 5起,通过泛型机制增强了类型安全性,但需要注意避免在运行时发生...
在《Java基础入门教程 第6章 集合框架》中,我们将深入探讨这个重要的话题。 首先,让我们从集合框架的基本组件开始。集合框架包含三个主要部分:接口、算法和实现。接口如`Collection`、`List`、`Set`和`Map`定义...
13. **字符串处理**:String类是不可变的,提供了丰富的操作字符串的方法,如concatenation(连接)、substring(子串)、indexOf(查找)等。 14. **枚举类型**:Java 5引入了枚举类型,用于定义一组固定的常量,...
一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 ...
字符串类String、StringBuilder和StringBuffer是处理文本数据的关键,特别是String是不可变的。时间处理涉及Date、DateFormat、SimpleDateFormat和Calendar类。File类用于文件操作,枚举用于定义常量集合。 第七章 ...
本教程"2020老杜最新Java零基础进阶视频教程-常用类课件"主要针对有一定编程基础的学员,讲解了Java的基础知识,包括面向对象的概念、异常处理、数组、常用类、集合框架、输入输出流(I/O流)、多线程以及反射机制。...
### Java授课计划知识点详解 #### 一、绪论与Java语言概述 - **知识点1:Java的...通过以上知识点的学习,学生能够系统地掌握Java编程语言的基础知识和面向对象编程的核心概念,并能够熟练地使用Java进行软件开发。
能够定义类,创建类的对象(实例化类)和通过对象引用访问数据成员和方法成员;形成定义类和使用类的两种不同的思维方式。 理解构造函数的作用(分配对象空间),理解和定义重载的构造函数。 明白...
4. **字符串处理**:String类是不可变的,学习其常用方法,如substring、indexOf、replace、trim等。 5. **异常处理**:理解异常的概念,学会使用try-catch-finally结构进行异常处理,并掌握Checked和Unchecked异常...
本教程主要涵盖了Java基础入门的第7章——集合类,内容包括常用集合类、迭代器的使用、foreach循环、泛型以及Collections和Arrays工具。 首先,我们来看集合概述。集合是Java中的一个重要概念,它可以存储任意数量...
5. **字符串处理**:Java中的String类是不可变的,了解其常用方法如concat、substring、indexOf、replace等。 6. **集合框架**:学习List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap...
5. **字符串**:Java中的String是不可变对象,理解其特点和常用方法。 **三、面向对象编程** 1. **类与对象**:理解类的定义、对象的创建和初始化,以及封装的概念。 2. **继承与多态**:掌握单一继承和多态性,...
- String类在Java中是不可变的,提供了许多用于操作字符串的方法,如concat、substring、indexOf、replace等。 6. **数组和集合**: - 数组是存储同类型数据的序列,Java提供了单列集合(如ArrayList、LinkedList...