gpt4 book ai didi

java - (Date) 可以通过将外部可变对象存储到 CategoryModel.createdDate 来公开内部表示

转载 作者:行者123 更新时间:2023-11-29 04:27:50 25 4
gpt4 key购买 nike

在处理模型类时,我面临以下警告:--

com.model.products.CategoryModel.setCreatedDate(Date) may expose internal representation by storing an externally mutable object into CategoryModel.createdDate

我的模型类

@JsonInclude(Include.NON_NULL)
public class CategoryModel {

private Date createdDate;

public Date getCreatedDate() {

return createdDate;

//Warning Message:--com.model.products.CategoryModel.getCreatedDate(Date) may expose internal representation by storing an externally mutable object into CategoryModel.createdDate

public void setCreatedDate(Date createdDate) {

this.createdDate = createdDate;

//Warning Message:--com.model.products.CategoryModel.setCreatedDate(Date) may expose internal representation by storing an externally mutable object into CategoryModel.createdDate

}

警告说明:--

返回对存储在对象字段之一中的可变对象值的引用会公开对象的内部表示。如果不受信任的代码访问实例,并且对可变对象进行未经检查的更改会危及安全性或其他重要属性,则您需要采取一些不同的措施。在许多情况下,返回对象的新副本是更好的方法。

在上面的模型类中我收到警告,处理这个问题的更好方法是什么?提前致谢...

最佳答案

防御性副本

您正在接受来自您的类外部的对可变对象的引用,以便在您的类内部使用。这意味着该可变对象的源可以在您背后改变其值。一会儿你自己的对象包含今年的 6 月 3 日,一会儿它包含去年的 11 月 27 日。任何其他引用该可变对象的对象都可能以同样悲惨的方式在您背后改变其值。

最佳做法是在接收到该可变对象时制作一份防御性副本。将其内部值复制到另一个新对象中。您知道这个新对象是安全的,因为没有其他对象引用它。

如果您不了解 Java 中对象引用的这种行为,请学习一些有关 Java 编程的基础知识。也许是 Oracle.com 教程,或者 O'Reilly 出版商的 Head First Java 书籍。

防御性复制的替代方法是首先使用不可变对象(immutable对象)。如果不可变,则消除了整个问题。

java.time

您正在使用麻烦的旧日期时间类,现在已被现代 java.time 类所取代。

java.time 类是 immutable .因此,如果您将 DateCalendar 的每次使用都替换为 java.time 类,那么上述问题就会消除。在 UTC 时间轴上,与 java.util.Date 相同,使用 java.time.Instant .

public class CategoryModel {

// Member fields.
private Instant created ;

// Constructor.
public CategoryModel ( final Instant created ) { this.created = Objects.requireNonNull( created ) ; }

// Getters.
public Instant getCreated() { return this.created ; }

// Setters.
public void setCreated ( final Instant created ) { this.created = Objects.requireNonNull( created ) ; }

}

与旧代码交互时的用法。

CategoryModel cm = new CategoryModel ( myJavaUtilDate.toInstant() ) ;

和:

java.util.Date myJavaUtilDate = Date.from( cm.getCreated() ) ;

关于java - (Date) 可以通过将外部可变对象存储到 CategoryModel.createdDate 来公开内部表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45317995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com