首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java类中的最终可选成员变量

问Java类中的最终可选成员变量
EN

Stack Overflow用户
提问于 2013-11-25 09:58:43
回答 3查看 937关注 0票数 2

我有一个场景,在类级别上声明的一些最终变量在某些情况下是可选的。

这意味着我有不同的构造函数。其中一些必须将成员变量保留为空值。

因为我已经将变量声明为final,所以我不得不在构造函数中初始化这些变量。因此,我必须在构造函数中添加var = null;语句。

但是显式地将变量赋值为null被认为是一种糟糕的实践,PMD之类的工具将其报告为违反行为。( PMD中有争议的规则。但是不想关闭它,因为我不希望在代码的其他领域中执行空赋值)

为了达到这个目的,还有其他的建议或良好的做法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-25 10:03:25

可以使用构造函数链接,将null传递给实例中未使用的值。(如果我们讨论继承,可以使用超级构造函数,也可以在同一个类中使用不同的构造函数。)毕竟,我会重新考虑类的设计,例如,将可选部分提取到另一个类。

票数 0
EN

Stack Overflow用户

发布于 2013-11-25 10:02:31

为实例变量分配默认值(自定义对象为null)。

所以,除非你真的给你的最终变量分配了一些值,否则为什么还要考虑空赋值呢?

正如用户在上面的评论中所指出的,对于最终变量来说,这是不太好的。因此,所能做的是定义一个no构造函数,并将所有最终值设置为null。

现在,在单个arg构造函数中,使用this()作为第一条语句调用此默认构造函数。然后,您可以根据传递的参数分配值。

票数 0
EN

Stack Overflow用户

发布于 2022-08-20 00:29:18

您要寻找的是构建器模式.

假设您有一个类具有接受所有值的构造函数:

代码语言:javascript
复制
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;
    }
}

现在,您希望让其他人创建这个对象的不同风格,同时保持它的不可变性,从它中删除默认值逻辑,并保持它的干净。您创建了一个新的构建器类:

代码语言:javascript
复制
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);
    }
}

现在,您可以轻松地创建不同的作业对象,同时强制执行这些要求:

代码语言:javascript
复制
Job job1 = JobBuilder(1).name("firstJob").retry(false).build();

Job job2 = JobBuilder(2).name("secondJob").build();

Job job3 = JobBuilder(3).build();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20189149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档