使用构建器模式编组解组不可变对象的最佳方法

Con*_*nor 8 java jaxb jersey jackson

我有一个简单的宁静服务,我正在用java开发.我一直在寻找编组/解组json的一些选项.可用的方法,jaxb jackson等,对我来说都是一个新手,我正试图找到他们的脚.我想知道我是否可以得到一些关于什么是最好的方法和技术的建议,特别是考虑到我感兴趣的许多对象已经实现为不可变并且我使用了构建器模式.所以没有setter,构造函数是私有的.

我看过上一个问题:Jackson + Builder Pattern?发布在stackoverflow上.我正在考虑类似这种方法的东西,尽管获得一些关于使用@JsonDeserialize的更多资源的指针会很棒

这是我正在考虑的对象类型的一个非常简单的例子

public class Reading {

private final double xCoord;
private final double yCoord;
private final double diameter;
private final double reliability;
private final String qualityCode;


private Reading(Builder builder){
    xCoord = builder.xCoord;
    yCoord = builder.yCoord;
    diameter = builder.diameter;
    reliability = builder.reliability;
    qualityCode = builder.qualityCode;
}


public static class Builder {
    //required parameters
    private final double diameter;
    //optional parameters
    private double xCoord = 0.0;
    private double yCoord = 0.0;
    private double reliability = 1.0;
    private String qualityCode;


    public Builder (double diameter){
        this.diameter = diameter;
    }

    public Builder reliability(double val){
        reliability = val;
        return this;
    }

    public Builder qualityCode(String qualityCode){
        this.qualityCode = qualityCode;
        return this;
    }

    public Builder coordinates(double xCoord, double yCoord){
        this.xCoord = xCoord;
        this.yCoord = yCoord;
        return this;
    }

    public Reading build(){
        return new Reading(this);
    }

}

public double getXCoord() {return xCoord;}

public double getYCoord() {return yCoord;}

public String getQualityCode() {return qualityCode;}

public double getDiameter() { return diameter;}

public double getReliability() {return reliability; }
Run Code Online (Sandbox Code Playgroud)

}

编组此对象没有问题,但解组似乎不是直截了当的.还是支持省略对象值为null的条目吗?

eke*_*ren 6

你可以这样做:(只实现getter并使用XmlAccessType.FIELD)

@XmlAccessorType(XmlAccessType.FIELD)
public class CreditCardVO implements Serializable {

  private Long ccNumber;
  private String ccName;


  public CreditCardVO(Long ccNumber, String ccName) {
   this.ccNumber = ccNumber;
   this.ccName = ccName;
  }


  private CreditCardVO() {
     // for JAXB's Magic
  }

  public Long getCcNumber() {
    return ccNumber;
  }

  public String getCcName() {
   return ccName;
  }    
}
Run Code Online (Sandbox Code Playgroud)

摘自http://aniketshaligram.blogspot.com/2010/05/jaxb-immutable-objects.html


bdo*_*han 2

您可以将 XmlAdapter 与 JAXB 结合使用来处理不可变对象: