gpt4 book ai didi

java - 使用 Date 或 List 在简单的 getter 和 setter 方法中解决 Sonar 问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:37 27 4
gpt4 key购买 nike

我编写这个 getter/setter 以从 Eclipse 源菜单中列出:

public Date getDate() {
return date;
}

public void setDate(Date date) {
this.date = date;
}

Sonar 报告两个问题:

Return a copy of "date" & Store a copy of "date"

有解释

"Mutable members should not be stored or returned directly"

和示例代码:

public String [] getStrings() {
return strings.clone();}

public void setStrings(String [] strings) {
this.strings = strings.clone();}

我认为如果我的日期为空,它会抛出 NullPointerException。然后我将代码更改为:

public Date getDate() {
if (this.date != null) {
return new Date(this.date.getTime());
} else {
return null;
}
}

public void setDate(Date date) {
if (date != null) {
this.date = new Date(date.getTime());
} else {
this.date = null;
}
}

现在标记其他问题:

"Assigning an Object to null is a code smell. Consider refactoring".

我在互联网上搜索并设置或返回一个新数组对我来说不是一个解决方案,如果设置参数为 null 以覆盖现有的先前列表,我想将我的列表保留为 null。

我对 List 也有同样的问题,我想返回/保留 null 而不是为空列表创建一个新的 ArrayList。在这种情况下,setter 标记了一个问题:

"Return an empty collection instead of null.".

这个问题的解决方案是什么?

最佳答案

如果您使用的是 Java 8 并且不想处理空日期,那么使用 Optional 可能会对您有所帮助。

编辑:“POJO”类的示例

public class Toto {

public Optional<Date> myDate;

public Optional<Date> getMyDate() {
return this.myDate;
}

public void setMyDate(final Date myDate) {
this.myDate = Optional.ofNullable(myDate);
}

}

代码使用示例:

Toto toto = new Toto();
toto.setMyDate(null);
System.out.println("Value is null ? " + toto.getMyDate().isPresent());
System.out.println("Value: " + toto.getMyDate().orElse(new Date()));

尝试用具体的日期值更改 toto.setMyDate(...) 看看会发生什么。

如果您不知道什么是 Optional 或如何使用它,您可以找到大量示例。

但是:这只是解决违规问题的一种方法,我完全同意 Brad 的评论,Optional 无意用作一种类型,而更像是潜在空/空返回。一般来说,如果违规不正确,您不应该仅仅为了修复违规而以错误的方式更正您的代码。在你的情况下,我认为你应该忽略违规行为(不幸的是,Sonar 的大多数违规行为都是如此)

如果你真的想在你的代码中使用 Java 8 和 Optional,那么你的 POJO 类将是这样的(仅将 Optional 用作 getter 的contrat)

public class Toto {


public Date myDate;

public Optional<Date> getMyDate() {
return Optional.ofNullable(this.myDate);
}

public void setMyDate(final Date myDate) {
this.myDate = myDate;
}

}

这样,

  • 你 bean 保持可序列化(可选不是)
  • 您仍然允许您的“客户端”代码选择如何处理您的属性的空值/空值
  • 将您的 Sonar 违规配置为误报,因为这是您想要的,而不是更改您的代码

关于java - 使用 Date 或 List 在简单的 getter 和 setter 方法中解决 Sonar 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42131930/

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