我正在从事一个项目,该项目涉及我使用 JAXB 创建音乐 XML 文件。这是我的“Note”类的代码片段,它代表吉他音符。
@XmlType(propOrder={"pitch", "duration", "type", "notations"})
@XmlSeeAlso({ChordNote.class, DrumNote.class})
public class Note {
private int duration;
private String type;
private Pitch pitch;
private Notations nots;
private int voice;
public Note() {}
public Note(int duration, String type, Pitch pitch) {
this.duration = duration;
this.type = type;
this.pitch = pitch;
}
public Note(int duration, String type, Pitch pitch, Notations nots, int voice) {
this.duration = duration;
this.type = type;
this.pitch = pitch;
this.nots = nots;
}
@XmlElement
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
}
@XmlElement
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@XmlElement
public Pitch getPitch() {
return pitch;
}
public void setPitch(Pitch pitch) {
this.pitch = pitch;
}
@XmlElement
public Notations getNotations() {
return nots;
}
public void setNotations(Notations nots) {
this.nots = nots;
}
@XmlElement
public int getVoice() {
return voice;
}
public void setVoice(int voice) {
this.voice = voice;
}
我们可以看到 note 类有多个构造函数,具体取决于我们要创建的便笺类型。这是 Note 对象的 XML 输出。
<note>
<pitch>
<step>E</step>
<octave>2</octave>
</pitch>
<duration>2</duration>
<type>eighth</type>
<notations>
<technical>
<string>6</string>
<fret>0</fret>
</technical>
</notations>
</note>
现在这是我的问题.. 每次我基于任一构造函数创建 Note 对象时,我注释为 @XmlElement 或 @XmlAttribute 的每个字段无论如何都会出现在 XML 中。在某些情况下,注释不应该有符号,但应该有其他所有内容,在其他情况下,它应该有符号但没有声音,从我的尝试来看,我无法控制它。我找到的唯一解决方案是创建多个从 note 继承的 Note 类,并根据我的需要创建正确类的实例。这会很快变得非常混乱,因为在很多情况下某些元素不应该出现在 XML 中,而有些应该出现。
如果 Xml 元素没有在构造函数中实例化,有什么方法可以隐藏它?例如,如果我将构造函数称为 public Note(int duration, String type, Pitch pitch),则符号和语音将不会出现在 XML 文件中。@XmlTransient 只是完全隐藏它,但我希望它只有在对象的构造函数中被提及时才会出现。
感谢您的帮助,厄尔布尔士