问题标签 [defensive-copy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
519 浏览

java - 构造函数中的“Collections.unmodifiableCollection”

在代码审查期间,我不时看到这样的构造函数:

这是保护班级内部状态的正确方法吗?如果不是,在构造函数中创建适当的防御性副本的惯用方法是什么?

0 投票
1 回答
234 浏览

c# - 创建自定义类的防御性副本的正确方法

我有以下课程:

我有另一个类将文件夹代理作为构造函数中的参数,这是创建文件夹代理对象的防御副本的正确方法吗?

0 投票
1 回答
1297 浏览

c# - 在构造函数中创建防御副本

以下只是解释我难以理解的问题的示例代码:

假设我有以下教授课程,请注意公共获取者和设置者:

和课程:

我将如何在 Course 类中制作教授对象的防御性副本?此处提供的示例使用日期对象就是这样做的。

可以对 Course 类中的教授对象做同样的事情吗?

更新:

接受提供的答案是我想出的,对吗?

0 投票
1 回答
747 浏览

java - 将不可变列表传递给 ImmutableList.copyOf()?

我有以下代码:

我的问题是这里的防御性 copyOf() 是否必要,因为 get() 无论如何都会返回一个不可变的列表?

注意我使用的是来自 Google Guava 的 ImmutableMultiimap。

谢谢。

0 投票
2 回答
222 浏览

java - 将对象的防御性副本添加到哈希集

目前我有这个代码:

我正在尝试重写它(只是在纸上),以便它制作/添加学生的防御性副本,而不是直接将它们添加到哈希集中,并且想知道以下代码是否会这样做:

如果需要,学生的代码:

谢谢

0 投票
1 回答
139 浏览

common-lisp - 带有防御性副本的 SETQ 或 SETF

我想知道如何在 Common Lisp 中执行以下操作。假设我在内存中有一个在某个时间是唯一的对象(实体)。我想做的是将一些变量设置为该对象的状态,作为某个时间的快照。然后原始实体可能会进化。但是,我想确保该变量仍然指向该实体过去的状态。

看来我需要的是类似于深拷贝+二传手的东西。复杂的因素是,有时实体的性质是未知的。它可能是一个数组,也可能是一个哈希表。它也可以是一个对象。

任何建议表示赞赏。

0 投票
1 回答
101 浏览

java - 使用 Guava 的不可变类型的防御性副本更简洁的代码?

我想使用 Guava 的不可变类型(例如ImmutableList. 我还必须能够处理null输入并将其视为空集合。

我能想到的最干净的是:

有没有更易读的东西,最好没有三元运算符?Optional.of(strings).map(...).orElse(...)由于我与此答案共享的推理,我不会认为这是一个不错的选择。

0 投票
1 回答
174 浏览

c# - 如果我有具有非只读结构作为成员的 ac# 只读结构,编译器将使用 in 参数创建防御性副本

所以,如果我有一个结构 PlayerData,它具有在 System.Numerics 中定义的 Vector3 结构的成员(不是只读结构)

我将它们传递给方法:

由于 Vector3 成员不是只读结构而是只读字段,c# 会创建防御性副本吗?现有库不提供 Vectors 的只读版本,所以如果我不为基本向量编写自己的版本,那么在传递大于 intptr 的结构时,我是否被迫忘记整个参数优化?阅读时有关使用情况的信息不是很清楚:https ://docs.microsoft.com/en-us/dotnet/csharp/write-safe-efficient-code

0 投票
5 回答
41 浏览

python - 如何在不修改源的情况下在函数中附加/前置列表?

鉴于此源列表:

这个功能:

正如预期的那样,我得到:

但是,如果我在函数之外调用变量 source_list ,我仍然会得到:

是否有另一种方法可以修改(特别是附加/前置)函数中的列表,以使原始列表不被更改?

0 投票
0 回答
50 浏览

c# - C#:为什么这些代码块的顺序会导致如此剧烈的性能变化?

in刚开始学习 C#,我正在测试使用修饰符和不使用修饰符将参数传递给方法之间的任何性能差异。所以我写了下面的代码,它的行为很奇怪,

我通过调用Vector.GetNewByRef()相对于该Vector.GetNew()方法的方法来测量性能增益的百分比。

当我运行上面的代码时,我平均获得了大约-0.5%的性能增益,波动大约为1-2% 。

现在,当我移动BLOCK-B之前BLOCK-AVectorPerfGain()平均性能增益会以3-4%的波动跃升至-28% !

等等。

当我更改struct Vectorclass Vector并运行 usingBLOCK-A之前BLOCK-B,平均性能增益为-21%,波动为2-3%Vector (即与a时发生的情况相反struct)。

然后,当我在性能大幅波动5-25%BLOCK-B之前运行代码时(注意这次是正数),所以这里的平均值不可靠。BLOCK-A

我遇到的最重要的问题是,为什么简单地改变两个相互独立的代码块的顺序会如此剧烈地改变结果?