问题标签 [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.
java - 根据构造函数的引用参数进行防御性复制
谁能告诉我在JAVA中类的构造函数的引用参数方面什么是防御性复制
非常感谢
java - 在 ArrayList 中添加对象(通过使用 BeanUtils 进行防御性复制)提供陈旧数据:Spring 3
CustomerDAO 类:
在CustomerDTO getCustomer(int customerId)
方法中,我试图通过使用 Spring 返回 CustomerDTO 对象的副本BeanUtils.copyProperties(targetCustomer, origCustomer);
,但是当我在方法中的列表中添加这些复制的对象时,List<CustomerDTO> getCustomerList(List<Integer> customerIds)
我得到了评论中提到的奇怪行为。如果我要删除BeanUtils.copyProperties(targetCustomer, origCustomer);
,那么行为是正确的。
测试用例:
使用复制的对象: BeanUtils.copyProperties(targetCustomer, origCustomer);
//spring BeanUtils
没有复制的对象: BeanUtils.copyProperties(targetCustomer, origCustomer);
//spring BeanUtils
有人可以解释一下这种行为有什么问题或可能的解释吗?
更新:使用 BeanUtils 的目的:
我试图在从方法返回 CustomerDTO 对象之前使用可变对象的防御性副本getCustomer()
。所以我尝试在这篇文章之后使用浅克隆。
更新:删除了 Immutability 这个词,因为它是错误的使用。
java - Java中防御性副本的效率低下
我是一名长期学习 Java 的 C/C++ 程序员。我已经阅读了通过使用返回对私有字段的引用的访问器方法来破坏封装的问题。标准的 Java 解决方案似乎是防御性复制——调用复制构造函数或 clone() 来创建字段的副本并返回对副本的引用。我不明白为什么似乎没有人担心制作防御性副本的效率低下。在 C++ 中,访问器只会返回一个指向 const 的指针,从而保护私有成员而不进行复制。为什么 Java 没有对 const 的引用?
java - 我是否需要防御性复制来构建一个具有 *non final * 尽管是不可变字段的不可变类?
如果一个人想要构造一个不可变的类,不应该公开对非 final 字段的引用 - 但即使是像 Strings 这样的不可变对象?
java - 防御性编程的各种情况如何处理?
这是 Effective java 中防御性复制的一个例子。假设我的基本问题中的场景需要一个防御性副本,并且不能与要求客户避免改变传入的对象的评论有关。
问题:
如果
Date
没有构造函数来接收自己,为了使我的自我更通用,传递一个对象而没有复制自身的机制,并且这样的对象不属于我们,即我们不能以任何方式更改它,该怎么办?如果构造函数将类型参数作为参数,比如
Period(T object)
T 可能是可变的,那么需要防御性副本怎么办。我们不知道什么是T。在这种情况下如何进行防御性副本?什么是传递接口,其中某些子类确实具有构造函数,例如
Date
创建自己的对象,而其某些子类没有任何机制可以这样做?我们应该在防守端复制多深?假设我们复制了一个数组,但数组元素是可变的?
java - 防御性副本可以使用线程安全的辅助吗?
在此示例中是否需要制作 fileName 参数的防御性副本?
理论上,另一个线程可以在调用该loadParametersFromFile
方法之前修改文件名。是不是和之前一样不String.valueOf(fileName)
被调用?
调用 loadParametersFromFile 时,如何确保在 fileName 中传递的值仍然相同?
java - 克隆“By”:使用 Selenium 进行防御性编程
因此,我正在为我正在使用 Selenium 测试的网站编写面板对象 API,并且由于将来可能会被许多不受我控制的人使用,所以我认为我不妨让它具有防御性(如见有效 Java)。但是,在返回 By 的克隆时,我遇到了困难。
我期待像arrayList这样的方法有:
不存在,因为 By 是静态制作的。此外,除了toString()
. 所以我可以为By.toString()
.
谁能建议一种在硒中克隆 By 定位器的不那么繁琐的方法?
java - 这个类可以变得更加不可变吗?
是否可以做更多的事情来使这个类不可变?字符串已经是不可变的,返回的集合是不可修改的。tutees 和 name 变量是私有的和最终的。还能做什么?如果使用 Tutor 类的唯一类在包中,我可以将构造函数、getTutees 方法和 getName 方法更改为包私有吗?
编辑:
这是 Student 类,问题要求我描述必要的更改以使 Student 不可变。我已经注释掉了两个 setter 方法,所以我可以使变量成为最终的。这是使它真正不可变的唯一方法吗?
java - 声纳违规:Security-Array 直接存储
我正在尝试使用声纳更改我的应用程序中的代码。如何解决它,为什么?谢谢。
java - 如果 java 类有另一个用户定义类的成员变量,我们如何使它不可变?
最近在 Java 开发人员角色的采访中,有人问我如何使 Class A 不可变,如果它有一个成员变量,它是 Class B 的一个对象,并且在 Class B 是项目外部并且不能被编辑的情况下程序员此外 B 类甚至可能有一个自己的成员变量,它是另一个用户定义类的对象。我想了很多,并告诉面试官,除非 B 类已经实现并暴露了一个方法来深度克隆自己,否则没有办法。
但面试官并不相信。真的有办法让这样的类不可变吗?
如果我没记错的话,这就是他解释的情况。他希望我使 A 类不可变,最好的答案是什么?