【问题标题】:Calling Methods in Java Constructor For Boolean Value在 Java 构造函数中调用布尔值的方法
【发布时间】:2020-11-07 21:35:29
【问题描述】:

我目前正在对继承的 Spring Boot 应用程序进行开发,其中一部分是发送一个 API POST 请求,其中包含足球比赛是否结束的布尔值 (resulted)。我注意到这个类的设计是这样的:

//parent class
public class Fixture {

    private final FixtureType type;
    private final Team homeTeam;
    private final Team awayTeam;

    public Fixture(@JsonProperty("type") final FixtureType type,
                   @JsonProperty("homeTeam") final Team homeTeam,
                   @JsonProperty("awayTeam") final Team awayTeam

    ) {
        this.type = type;
        this.homeTeam = homeTeam;
        this.awayTeam = awayTeam;
    }

    public boolean isResulted() {
        return false;
    } 
    /* 
     other methods
    */
}  
//child class
public class Result extends Fixture {

    private final Outcome outcome;

    public Result(@JsonProperty("type") final FixtureType type,
                  @JsonProperty("homeTeam") final Team homeTeam,
                  @JsonProperty("awayTeam") final Team awayTeam,
                  @JsonProperty("outcome") final Outcome outcome) {

        super(type, homeTeam, awayTeam);
        this.outcome = outcome;
    }

    @Override
    public boolean isResulted() {
        return true;
    }
    /* 
     other methods
    */
}

在 Swagger 文档中,请求指定 "resulted": true 需要是 JSON POST 请求中的一个字段。现在我可以将该字段添加到构造函数中,但这意味着更改调用此构造函数的大量测试和代码。我的解决方案是在构造函数本身中调用isResulted() 方法。我以前从未这样做过,但这有效。从长远来看,下面的这种设计是否会产生问题?

public class Result extends Fixture {

     private final boolean resulted;

     public Result (){
      super();
      resulted = isResulted();
     }

    @Override
    @JsonProperty("resulted")
    public boolean isResulted() {
        return true;
    }

}


【问题讨论】:

    标签: java spring-boot constructor jackson jackson-databind


    【解决方案1】:

    我不明白拥有一个不在任何地方使用的私有字段的目的是什么。我也不确定我是否理解您想要解决的问题。

    有一种可能的方法既更灵活又与您以前的代码兼容:

    public class Result extends Fixture {
    
         private final boolean resulted;
    
         public Result (boolean resulted){
          super();
          this.resulted = resulted;
         }
    
         public Result (){
            this(true); // sets the default value
         }
    
        @Override
        @JsonProperty("resulted")
        public boolean isResulted() {
            return resulted;
        }
    
    }
    

    【讨论】:

    • 嗨法比奥,感谢您的回复。我添加了实际的构造函数代码以获得更好的上下文。基本上isResulted() 方法在应用程序的其他地方被调用,这就是为什么我不愿意改变设计。
    • 现在说得通了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2019-03-11
    相关资源
    最近更新 更多