gpt4 book ai didi

java - MOXy/JAXB "prototype pattern"- 接口(interface)继承

转载 作者:行者123 更新时间:2023-12-01 04:39:32 25 4
gpt4 key购买 nike

我正在尝试使用 MOXy/JAXB 2.5.0 实现 Gang of Four 原型(prototype)模式的一个版本。我希望能够指定一个项目列表,其中一些项目“基于”其他项目,即从其他实例复制其数据。为了可重用性,我想创建一个任何可原型(prototype)对象都应该实现的接口(interface),它将为支持该模式所需的属性提供注释。

@XmlRootElement(name="IPrototype")
public interface IPrototype
{
/**
* Acts as a "copy constructor"
*/
@XmlAttribute(name="prototype")
@XmlIDREF
public void setPrototype(IPrototype prototype);

@XmlAttribute(name="id")
@XmlID
public void setId(String id);

public String getId();
}

理想情况下,实现对象看起来像这样,甚至不必费心从接口(interface)实现的方法的注释:

@XmlRootElement(name="Item")
public class Item implements IPrototype
{
private String m_id = null;

private String m_data = null;

public Item()
{

}

/**
* Never called
*/
@Override
public void setPrototype(IPrototype prototype)
{
m_data = ((Item)prototype).getData();
}

@Override
public void setId(String id)
{
m_id = id;
}

@Override
public String getId()
{
return m_id;
}

@XmlAttribute(name="data")
public void setData(String data)
{
m_data = data;
}

public String getData()
{
return m_data;
}
}

XML 看起来像:

<Wrapper>
<Item id="Item1" data="stuff and things" />
<Item id="Item2" prototype="Item1" />
</Wrapper>

其中 Wrapper 定义为:

@XmlRootElement(name="Wrapper")
public class Wrapper
{
@XmlElementRef
private ArrayList<Item> m_items = null;
}

如果它按照我想要的方式工作,我将得到一个包含两个元素的列表,这两个元素都是 Item 类型,并且包含相同的数据。但是,MOXy 似乎没有“看到”界面上的注释,并且我得到一个列表,其中包含两个没有设置 XmlID 的项目,并且 setPrototype() 从未被调用。唯一的解决方案似乎是在 Item 类中注释 setPrototype() 和 setId() 方法,但这似乎需要将 setPrototype() 的参数类型从 IPrototype 更改为 Item,以便 MOXy 将在正确的类中查找 XmlID。不幸的是,这破坏了继承的接口(interface)。

如果我将列表类型更改为 IPrototype,希望 MOXy 能够看到其注释,我会得到相同的行为 - null ID,setPrototype() 从未被调用。无论如何,这并不是我真正想要的,我希望能够限制哪些子类型可以包含在特定列表中。

不确定我对接口(interface)注释的工作方式有正确的期望,也许这就是我错误的根源。

关于如何让它发挥作用有什么想法吗?预先感谢,

史蒂夫

更新:如果我注释 Item 类,而不更改 setPrototype 的方法签名(我想我可以接受),我会得到一个包含两个项目的列表,并且正确设置了 XmlID,但 setPrototype() 仍然没有被调用。看起来 MOXy 正在寻找具有相同 XmlID 的 IPrototype 实例(不可能),而不是 Item 实例。

更新 2:而且,如果我将 IPrototype 转换为抽象类,一切都会完美运行。然而,考虑到 Java 的单继承模型,这对于旨在补充多继承层次结构的框架对象来说太有限了。所以还是卡住了。

最佳答案

通过注释 Item 的属性并使用泛型声明 setPrototype(),我得到了一个可以接受的运行版本。 IPrototype 中的声明如下所示:

public <T> void setPrototype(T prototype);

这是它在 Item 中的实现:

@XmlAttribute(name="prototype")
@XmlIDREF
@Override
public <T> void setPrototype(T prototype)
{
m_data = ((Item)prototype).getData();
}

它有效,但我不太喜欢重新注释子类。我对此提出了一个单独的问题,因为(对我来说)直观上看起来这不是接口(interface)注释应该工作的方式:

MOXy/JAXB interface annotation

关于java - MOXy/JAXB "prototype pattern"- 接口(interface)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16807019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com