美文网首页
“不要编写返回引用可变对象的访问器方法”

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

作者: 暖熊熊 | 来源:发表于2018-08-06 22:08 被阅读0次

"注意不要编写返回引用可变对象的访问器方法".因为会破坏类的封装性,引用的内容可能会被改变,产生业务逻辑上的错误.
什么是可变对象?
先要搞清楚java中值传递和引用传递的问题,总结如下:
1.对象就是传引用
2.原始类型就是传值
3.String,Integer, Double等immutable类型因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待。可以认为是传值。
Integer 和 String 一样。保存value的类变量是Final属性,无法被修改,只能被重新赋值/生成新的对象。 当Integer 做为方法参数传递进方法内时,对其的赋值都会导致 原Integer 的引用被 指向了方法内的栈地址,失去了对原类变量地址的指向。对赋值后的Integer对象做得任何操作,都不会影响原来对象。
所以,可变对象即immutable类型外的一般对象.[immutable类:如果类中的每个方法否不会改变其对象,这种类就是不可变的类.]
如果需要返回一个可变对象的引用,首先对它克隆,使用.clone,如return hireDay.clone();,会生成另一个内存位置上的对象副本.
很多人对"java程序设计语言总是采用按值调用"这句话与引用传递产生误会,认为矛盾,其实不矛盾,引用传递时,方法调用的是对象的拷贝值,也是对类对象的引用,当方法调用结束时,拷贝值不再使用,方法执行过程中通过拷贝值修改的对象值被改变.

package com.ghw.test;

import java.util.Date;

/**
 * java core中提到不要编写返回引用对象的访问器方法,此处对此演示
 * 这里user.getTime返回的是time这个Date对象的引用,因此d调用setTime
 * 修改的就是time这个对象。
 */
public class ReturnValueTest {
    public static void main(String[] args) {
        User user = new User();
        Date d = user.getTime();
        System.out.println(d);                  //Fri Aug 03 17:51:50 CST 2018
        d.setTime(1);
        System.out.println(user.getTime());     //Thu Jan 01 08:00:00 CST 1970
    }
}

class User {
    private Date time = new Date();

    public Date getTime() {
        return time;           //可以在这里添加clone,return (Date) time.clone();
    }
}
package com.ghw.test;

/**
 * java core中提到类中的方法可以访问所属类的私有特性(属性或方法)
 */
public class ReturnValueTest {
    public static void main(String[] args) {
        User user1 = new User();
        user1.hello();
    }
}

class User {

    public void hello() {
        helloa();
    }

    private void helloa() {
        System.out.println("helloa");
    }
}

相关文章

  • “不要编写返回引用可变对象的访问器方法”

    "注意不要编写返回引用可变对象的访问器方法".因为会破坏类的封装性,引用的内容可能会被改变,产生业务逻辑上的错误....

  • 【Java补充】注意不要编写返回引用可变对象的访问器方法

    下面的Employ违反了这个原则,在getHireDay方法中返回了一个Date类对象 Date类有更改器方法se...

  • copy、mutableCopy

    copy:对于可变对象为深拷贝,引用计数不改变;对于不可变对象是浅拷贝, 引用计数每次加一。始终返回一个不可变对象...

  • sort&sorted

    一、区别: sort()是可变对象(字典、列表)的方法,无参数和返回值,会改变可变对象,不可变对象如果调用会返回一...

  • iOS-NSArray

    NSArray数组类:不可变,对象的有序集合(对象可为不同类型) ,存储对象的地址(引用) ,通过下标访问,下标...

  • 浅拷贝的问题

    内存管理属性retain:浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致。copy:对于可变对象...

  • java 一日俩坑 4

    方法中,关键字this表示隐式参数; 类的访问器方法需要返回一个可变数据域的拷贝,应该使用clone,防止破坏数据...

  • 2018-08-28java基础重温1

    构造器初始化: 构造器返回对象实例,对象引用的内存分配和初始化已经在构造器方法之前已经做完。只是此时的对象还不能被...

  • python 传递参数

    返回结果 显然python传参数的方式是传引用。 不可变对象 对于不可变对象,你在函数内做什么都不会改变外面的结果...

  • python入门——列表

    一:列表 可包含任意类型的对象的有序集合 通过下标访问元素 可变长度、可任意嵌套 支持原位改变 对象对象引用数组 ...

网友评论

      本文标题:“不要编写返回引用可变对象的访问器方法”

      本文链接:https://www.haomeiwen.com/subject/axsuvftx.html