问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何创建不可变的Java类或对象

发布网友 发布时间:2022-04-07 04:45

我来回答

2个回答

懂视网 时间:2022-04-07 09:06

对象的不变性意味着我们不希望对象在创建后以任何方式更改(将它们设置为只读类型)。

假设我们需要定义一个 car 对象,并在整个项目中使用它的属性来执行操作。我们不能允许错误地修改任何数据。

const myTesla = {
 maxSpeed: 155,
 batteryLife: 300,
 weight: 2300
};

Object.preventExtensions() 防止扩展

此方法可防止向现有对象添加新属性,preventExtensions() 是不可逆的操作,我们永远不能再向对象添加额外的属性。

Object.isExtensible(myTesla); // true
Object.preventExtensions(myTesla);
Object.isExtensible(myTesla); // false
myTesla.color = 'blue';
console.log(myTesla.color) // undefined

Object.seal() 密封

它可以防止添加或删除属性,seal() 还可以防止修改属性描述符。

Object.isSealed(myTesla); // false
Object.seal(myTesla);
Object.isSealed(myTesla); // true

myTesla.color = 'blue';
console.log(myTesla.color); // undefined

delete myTesla.batteryLife; // false
console.log(myTesla.batteryLife); // 300

Object.defineProperty(myTesla, 'batteryLife'); // TypeError: Cannot redefine property: batteryLife

Object.freeze() 冻结

它的作用与 Object.seal() 相同,而且它使属性不可写。

Object.isFrozen(myTesla); // false
Object.freeze(myTesla);
Object.isFrozen(myTesla); // true

myTesla.color = 'blue';
console.log(myTesla.color); // undefined

delete myTesla.batteryLife;
console.log(myTesla.batteryLife); // 300

Object.defineProperty(myTesla, 'batteryLife'); // TypeError: Cannot redefine property: batteryLife

myTesla.batteryLife = 400;
console.log(myTesla.batteryLife); // 300

注意:如果希望在尝试修改不可变对象时抛出错误,请使用严格模式。

推荐教程:js入门教程

热心网友 时间:2022-04-07 06:14

不可变对象是指一个对象的状态在对象被创建之后就不再变化。不可变对象对于缓存是非常好的选择,因为你不需要担心它的值会被更改。

创建一个不可变类:
将类声明为final,所以它不能被继承;
将所有的成员声明为私有的,这样就不允许直接访问这些成员;
对变量不要提供setter方法;
将所有可变的成员声明为final,这样只能对它们赋值一次;
通过构造器初始化所有成员,进行深拷贝(deep copy);
在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝;

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

public final class Immutable {
private final int id;
private final String name;
private final HashMap map;

public int getId() {
return id;
}

public String getName() {
return name;
}

/**
* 可变对象的访问方法
*/
public HashMap getMap() {
return (HashMap) testMap.clone();
}

/**
* 实现深拷贝的构造器*/
public Immutable(int i, String n, HashMap hm){this.id=i;
this.name=n;
HashMap tempMap=new HashMap();
String key;
Iterator it = hm.keySet().iterator();
while(it.hasNext()){
key=it.next();
tempMap.put(key, hm.get(key));
}
this.map = tempMap;
}

}

不变模式有两种形式:弱不变模式和强不变模式。
弱不变模式,指类实例的状态是不可改变,但是这个类的子类的实例具有可能会变化的状态,要实现弱不变模式,一个类必须满足下面条件:
对象没有任何会修改对象状态的方法 ,这样一来当对象的构造函数将对象的状态初始化之后,对象的状态便不再改变;
属性都是私有的,以防客户端对象直接修改内部状态;
这个对象所引用的其他对象如果是可变的话,必须设法*外界对这些可变对象的访问,以防止外界修改这些对象,尽量在不可变对象内部初始化这些被引用的对象,而不要在客户端初始化再传入到不可变对象内部来,如果某个可变对象必须在客户端初始化,然后再传入到不变对象里的话,就应当考虑在不可变对象初始化的时候,将这个可变对象进行拷贝。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
潍坊哪里有卖有影像的游戏王决斗盘 游戏王决斗盘哪卖? 中国有卖〔游戏王〕动画片中的战斗盘的吗?如果有,安徽哪有卖的? ___有两个端点,___只有一个端点,___没有端点 线段线段有两个端点,射线射线只有一个端点,直线直线没有端点._百度知 ... 监理费,设计费,勘探费,咨询费可否计入固定资产单 工程设计计入什么科目 求爱情语录 像送心爱的人回家 哪都顺路这种超经典超浪漫超温馨的_百度... 内眼角起疱是怎么回事 新绝代双骄之鱼戏江湖 怎么玩不了? 求解 老师我的PR怎么导入不了 flv 格式? 微信为什么取消“上传聊天记录并在云端7 天”的功能 如何关闭手机微信聊天记录备份功能? 怎么在win7电脑上添加已有的打印机 微信如何设置美颜视频聊天 为什么一到晚上鼻子就不通了? 支付宝冲话费信用卡有额度怎么显示没额度冲不了 家长应该用什么方法可以在日常生活中开发孩子的大脑? 信用卡有额度但是在支付宝里面没 开发小孩子大脑怎么开发? 支付宝绑信用卡为什么只能扫码刷200 能够促进小孩子大脑发育的要素,都有什么呢? 小孩子吃什么有利于脑力开发? 新鲜玉米馍怎么做好吃 有利于宝宝大脑开发的方法有哪些 支付宝里面的邮储银行信用额度为什么用不了? 通过全脑开发全面提高孩子的智商,有哪些好的方式方法吗? 如何开发孩子的大脑? 简单开发孩子脑力,都有哪些方法? 哪个品牌的取暖器最好? 华为荣耀6怎么样好用吗 华为荣耀6手机怎么样? 大神们,你们用过华为荣耀6怎么样?或者米4? 华为荣耀6怎么样? adobe premiere 为什么打不开FLV的视频 华为荣耀6处理器怎么样,手机性能如何 华为荣耀6质量怎么样 华为荣耀6✘怎么样? 华为荣耀6支持什么类型的SIM卡 华为荣耀6cpu怎么样 华为荣耀6至尊版和荣耀6有什么不同 怎样用PS抠取有镂空的图 PS如何抠镂空雕花实物 PS中如何用钢笔工具抠图。就是描好的选区去掉,形成一个镂空区域。 怎么从PS里面抠图到3D里面挤出建模 (镂空) ps透明物体怎么抠图 郑州市新程汽车零部件有限公司怎么样? 高合汽车创始人 在CAD室内建筑施工图中WH是指什么? cad图纸里的英文WH,CH,DH,BH是什么高?