即使Eclipse在bolt_component.xhtml中标记了行#{cc.attrs.bolt.spec.size}
,代码似乎仍然有效,因为spec.size
无法解析该属性
bolt_component.xhtml
<composite:attribute name="bolt" type="model.bolts.Bolt" />
#{cc.attrs.bolt.spec.size}
我的抽象类
public abstract class Bolt implements Serializable {
protected BoltSpec spec;
I have setSpec()
but not a getSpec()
和具体的课程
public class BoltHexHead extends Bolt implements Serializable {
private static final long serialVersionUID = 1L;
private BoltSpecHexHead spec;
public BoltSpecHexHead getSpec() {
return spec;
}
public void setSpec(BoltSpecHexHead spec) {
this.spec = spec;
super.setSpec(spec);
}
我意识到为什么Eclipse会标记,因为我没有getSpec()但是当我在Bolt中添加getSpec时,我在我的控制器中得到一个空指针,它使用HexHeadBolt .getSpec()
结果为null不应该。
if (analysisHexHeadWithNutOperational.getBolt().getSpec().getSize() == null) {
我尝试过多种getter setters私人保护组合......
Eclipse标记错误了吗?或者我的继承设置不正确我正在使用Luna
添加截图显示即使使用更干净的DRY代码,使用参数化属性,日食仍然标记“大小”无法解析,但仅在自定义组件中
通过向cc接口添加spec
,我可以让Eclipse停止标记
faclet
<stk:bolt_component boltTypes="#{data.hexHeadBoltTypes}"
bolt="#{hex_head_nut_operational.boltAnalysis.bolt}"
spec="#{hex_head_nut_operational.boltAnalysis.bolt.spec}" />
CC
composite:interface>
<composite:attribute name="boltTypes" />
<composite:attribute name="bolt" />
<composite:attribute name="spec" />
答案 0 :(得分:1)
我认为你很难弄清楚如何使用带有通用抽象螺栓规格的抽象螺栓。在具有公共属性(和getter / setter)的良好抽象类中,不必在每个子类中重复getter / setter并委托给super
。 getSpec()
尝试中的错误很可能是您未委托给super
。而且,子类重复spec
属性是不必要的。
public BoltSpecHexHead getSpec() {
return (BoltSpecHexHead) super.getSpec();
}
public void setSpec(BoltSpecHexHead spec) {
super.setSpec(spec);
}
实际上,这不是DRY。如果抽象类的属性反过来也是抽象的,并且你想避免地狱,那么你最好把它变成参数化类型。
public abstract class BoltSpec {
// ...
}
public abstract class Bolt<S extends BoltSpec> {
private S spec;
public S getSpec() {
return spec;
}
public void setSpec(S spec) {
this.spec = spec;
}
}
public class BoltSpecHexHead extends BoltSpec {
// ...
}
public class BoltHexHead extends Bolt<BoltSpecHexHead> {
// ... (note: no getSpec()/setSpec() necessary!)
}