Java类中返回引用对象之后导致类中数据被修改的情况

Java类中返回引用对象之后导致类中数据被修改的情况

package Learning;

import java.util.Date;

public class ClassDemo {
    private String sss;
    private Date d;
    public ClassDemo(String sss) {
        this.sss = sss;
    }

    public String getSss() {
        return sss;
    }

    public ClassDemo(String sss, Date d) {
        this.sss = sss;
        this.d = d;
    }

    public Date getD() {
        return d;
    }

    public static void main(String[] args) {
        ClassDemo c=new ClassDemo("asd",new Date());
        System.out.println(c.d);
        Date s=c.getD();
        s.setTime(1212123123);
        System.out.println(c.d);
    }
}

Java类中返回引用对象之后导致类中数据被修改的情况
根据上图可以发现对象中的数据被修改了,但是代码中并没有修改器方法,只有访问器方法,那么问题出在了哪里?
由于getD返回的方法是一个引用可变对象,这导致了类外部的一个Date类也拥有了管理类内部数据的渠道,也就是这个外部的Date类指向了类内部的成员,而这时对内外部的数据进行修改也会同时修改类内部的数据,因此请不要编写返回引用可变对象的访问器方法。
当然,如果一定要返回一个可变对象的引用,那么应该先对它进行克隆,对象clone是指存放在另一个位置上的对象副本。
修改后的getD代码如下:

    public Date getD() {
        return (Date)d.clone();
    }

Java类中返回引用对象之后导致类中数据被修改的情况
可以发现修改外部Date对象并没有导致类内对象的数据被修改。

上一篇:一句话解释双向数据绑定,让面试不尴尬。什么是 object.defineProperty() 。手写v-model。硬核


下一篇:ssss) 页面跳转和数据处理sss