我有一个场景,在类级别上声明的一些最终变量在某些情况下是可选的。
这意味着我有不同的构造函数。其中一些必须将成员变量保留为空值。
因为我已经将变量声明为final,所以我不得不在构造函数中初始化这些变量。因此,我必须在构造函数中添加var = null;语句。
但是显式地将变量赋值为null被认为是一种糟糕的实践,PMD之类的工具将其报告为违反行为。( PMD中有争议的规则。但是不想关闭它,因为我不希望在代码的其他领域中执行空赋值)
为了达到这个目的,还有其他的建议或良好的做法吗?
发布于 2013-11-25 10:03:25
可以使用构造函数链接,将null传递给实例中未使用的值。(如果我们讨论继承,可以使用超级构造函数,也可以在同一个类中使用不同的构造函数。)毕竟,我会重新考虑类的设计,例如,将可选部分提取到另一个类。
发布于 2013-11-25 10:02:31
为实例变量分配默认值(自定义对象为null)。
所以,除非你真的给你的最终变量分配了一些值,否则为什么还要考虑空赋值呢?
正如用户在上面的评论中所指出的,对于最终变量来说,这是不太好的。因此,所能做的是定义一个no构造函数,并将所有最终值设置为null。
现在,在单个arg构造函数中,使用this()作为第一条语句调用此默认构造函数。然后,您可以根据传递的参数分配值。
发布于 2022-08-20 00:29:18
您要寻找的是构建器模式.
假设您有一个类具有接受所有值的构造函数:
class Job {
private final Integer id;
private final String name;
private final Boolean retry;
public class Job(Integer id, String name, Boolean retry) {
this.id = id;
this.name = name;
this.retry = retry;
}
}现在,您希望让其他人创建这个对象的不同风格,同时保持它的不可变性,从它中删除默认值逻辑,并保持它的干净。您创建了一个新的构建器类:
class JobBuilder {
// Values the user MUST provide are non-initialized and
// declared as final
private final Integer id;
// Values the user MAY provide are initialized with default values
// and are not final
private String name = "[none]";
private Boolean retry = true;
public class JobBuilder(Integer id) {
this.id = id;
}
public JobBuilder name(String name) {
this.name = name;
}
public JobBuilder retry(Boolean retry) {
this.retry = retry;
}
public Job build() {
return new Job(this.id, this.name, this.retry);
}
}现在,您可以轻松地创建不同的作业对象,同时强制执行这些要求:
Job job1 = JobBuilder(1).name("firstJob").retry(false).build();
Job job2 = JobBuilder(2).name("secondJob").build();
Job job3 = JobBuilder(3).build();https://stackoverflow.com/questions/20189149
复制相似问题