问题标签 [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 投票
5 回答
327 浏览

java - LinkedList 插入绑定到插入的对象

我的代码如下所示:

并且似乎每当我做类似 的事情时term.add(anotherTerm), anotherTerm 是......另一个 Term 对象,似乎 anotherTerm 引用的内容与我刚刚插入 term 的内容相同,因此每当我尝试更改 anotherTerm 时,term.get( 2)(比方说)get也变了。

我怎样才能防止这种情况发生?

由于请求了代码:

调用插入方法的代码:

创建 anotherTerm 术语的代码:

调用插入方法的新代码:

clone() has protected access in java.lang.Object不幸的是,即使在做了之后,它仍然不起作用public class Term implements Cloneable{

0 投票
2 回答
3012 浏览

java - How do I make defensive copy of an object?

How do I make defensive copies of a Mutable Object which contains a mutable field in an Immutable Object?

#xA;
  • The MutableObject does not have a constructor that lets me set the field.
  • The MutableObject's current state should be captured in the Immutable Object and never changed.
0 投票
4 回答
2353 浏览

java - 将可变对象封装成只读对象

我目前正在实施迭代求解器,它通过不断改进对特定问题的解决方案的估计来工作。由于解决方案是一组相当大的数据,因此进行了适当的细化。

我已经实现了一个简单的 Observer/Observable 模式,以便能够在迭代发生时观察算法。特别是,求解器提供了一种方法

它返回解决方案的当前估计。然后观察者可以根据当前估计自由地进行一些计算(例如:决定解决方案是否足够好以及是否可以停止迭代)。Foo是可变的,但是当然,如​​果观察者修改了解决方案的当前估计,这可能会破坏求解器的迭代。

所以,getCurrentSolution()真的应该回归防御副本。但这需要时间和内存来解决大问题,所以我想出了另一个想法,即getCurrentSolution()返回一个 new ReadOnlyFoo(bar),其中foo(可变的)当前解决方案估计值是求解器私有的。这个想法是它ReadOnlyFoo具有与 几乎相同的接口Foo,只有可能修改数据的方法被“停用”(它们抛出异常)。下面给出了一些虚拟类的所有细节。

我的问题是:这种方法是好的做法吗?有更好的模式吗?

谢谢!塞巴斯蒂安

0 投票
1 回答
331 浏览

c# - 用防御副本交换收藏

这是我在Effective C#书中看到的一个示例:

作者说这将适用于值类型而不是引用类型。我无法理解他的意思。

我想我现在明白了:集合是 ref 类型。“数据字段”的消费者不会记得他们持有堆上旧存储的副本。如果“数据”是值类型 - 消费者(使用数据的其他代码)会记得他们持有数据的深层副本,并会在需要更新时再次请求它。

正确的 ?

0 投票
7 回答
13509 浏览

java - 日历的防御副本

一直在尝试找到实现制作日历对象的防御性副本的方法的最佳方法。

例如:

在检查空输入并制作副本时,我特别担心线程的交错,或者我是否遗漏了一些非常明显的东西?

0 投票
0 回答
291 浏览

java - 如何让 MyBatis 与防御性副本一起工作?

让我们假设这个简单的模式:

MyBatis 中的这个映射:

这是我的用户 bean 的实现:

所以一切都很简单,除了我从我的用户 bean 实现中的角色列表中获取防御性副本。问题是 MyBatis 似乎根本不支持这一点,并且生成的角色列表将为空。如果我不拿这些副本,它会顺利运行,但设计会很糟糕。有没有解决的办法?

0 投票
2 回答
1388 浏览

java - 关于不可变类防御性复制

我有一个关于创建不可变类的查询。以下是我考虑的几点:

  1. 使课程最终
  2. 使所有成员成为最终成员,在静态块中或在构造函数中显式设置它们
  3. 将所有成员设为私有
  4. 没有修改状态的方法
  5. 要非常小心地限制对可变成员组件的访问(记住该字段可能是最终的,但对象仍然可以是可变的。即私有最终日期 imStillMutable) - 请参阅防御性复制或其表亲复制构造函数以获取更多信息。


但是我根本没有完全理解 5 点,您能否建议或给我看一个例子,其中 5 点在那个例子中很清楚?

0 投票
3 回答
1101 浏览

java - 制作 Set 的一般副本在构造函数中

我没有找到这个特定问题的直接答案,所以......假设类:

我只想要一个副本而不关心集合的确切实现,开销最小,所以基本上是任何内部状态 initialTags 的直接副本。我不能使用clone,因为 Set 是接口。这是可能的,还是我必须使用类似的东西new HashSet<String>(tags);,需要对类型做出决定?

假设:设置项目类型被限制为不可变。我可以相信调用者不会传递一个损坏的initialTagsSet 实现,并且我可以相信它有足够好的性能用于此类中的任何内部使用。

我正在考虑尝试反射和克隆(),但这似乎有点脏......

0 投票
0 回答
112 浏览

java - 流和进程的防御性副本

我正在Process proc运行,如果发生错误,我需要销毁并重新创建它。
这是因为通过标准输入向无法解决的进程发送命令时出现问题。
我的解决方法是重置我建立的“连接”(stdin、stdout、stderr)并从新进程中获取新流。当进程结束时,我正在使用线程进行观察。如果发生错误,我会通过退出命令关闭进程并中断导致它最终关闭流的线程。
主线程已经在建立一个新的连接。在重建连接后发送命令时,IOException 状态流已关闭。
有没有办法可以复制旧流以稍后关闭它?我已经尝试过用另一个阅读器包装它,但没有成功。我不确定通过 getXXXStream() 获取进程的流并关闭它们是否足够,因为这不会关闭上面的读者。另外我担心,我可以抓住新进程并关闭它的流。
我不希望它阻止。
编辑:
正如我的第一条评论所述,我立即关闭了流,但问题Process仍然存在。如果我要等待 1000 毫秒来关闭它并使用新的重新分配 proc,Process我的线程将使用新的线程运行(例如调用exitValue())。

这是我的主题:

建立我的连接的方法(连接+重新连接):

0 投票
2 回答
211 浏览

objective-c - 访问器方法中的 Objective-C 防御性复制

来自 Java 背景,我在想办法在 Objective-C 中进行防御性编程时遇到了麻烦。
假设SomeClass是可变的并提供了一个复制方法,这是我用 Java 编写的一段典型代码:

我花了一些时间才弄清楚

在将 setter 的参数分配给 customerList 属性之前,会对其进行复制。让我困惑的是写一个合适的吸气剂。到目前为止,它看起来像这样:

它适用于所有内部方法调用,如 self.customerList = ...,但会将直接指针传递给任何造成安全漏洞的外部调用。我正在考虑提供一个不同的公共 getter 来返回一个副本,但想避免它,因为它需要一个非常规的名称。你会如何处理这种情况?
谢谢你。