gpt4 book ai didi

java - 使用instanceof运算符进行反序列化

转载 作者:行者123 更新时间:2023-12-01 18:10:46 25 4
gpt4 key购买 nike

我遇到过不同的帖子,这些帖子说使用instanceof不被认为是一个好的做法。

http://www.javapractices.com/topic/TopicAction.do?Id=31 https://www.artima.com/interfacedesign/PreferPoly.html

我的情况是,我有一个序列化对象,它可以是 7,8 种实际类型。现在我正在使用 insttanceof 运算符并使用各种 if 条件检查对象是否为实际类型,然后执行一些操作。

我的设计不好吗?

如果是这样,我如何在不使用 instanceof 的情况下解决此问题?

每个对象的继承层次结构都不同,因此我很难用多态性来替换它。

代码

 public String exportAsPMML(MLModel model) throws MLModelHandlerException {
Externalizable extModel = model.getModel();

//Deserializing to find the actual type of the model
if (extModel instanceof MLClassificationModel) {
ClassificationModel clasModel = ((MLClassificationModel) extModel).getModel();
if (clasModel instanceof LogisticRegressionModel) {
return ((LogisticRegressionModel) clasModel).toPMML();
} else {
throw new MLModelHandlerException("PMML export not supported for model type");
}
} else if (extModel instanceof MLGeneralizedLinearModel) {
GeneralizedLinearModel genModel = ((MLGeneralizedLinearModel) extModel).getModel();
if (genModel instanceof LinearRegressionModel) {
return ((LinearRegressionModel) genModel).toPMML();
} else if (genModel instanceof LassoModel) {
return ((LassoModel) genModel).toPMML();
} else if (genModel instanceof RidgeRegressionModel) {
return ((RidgeRegressionModel) genModel).toPMML();
} else {
throw new MLModelHandlerException("PMML export not supported for model type");
}
} else if (extModel instanceof MLKMeansModel) {
KMeansModel kmeansModel = ((MLKMeansModel) extModel).getModel();
return kmeansModel.toPMML();
} else {
throw new MLModelHandlerException("PMML export not supported for model type");
}
}

最佳答案

使用现有接口(interface)PMMLExportable

GeneralizedLinearModel genModel = ((MLGeneralizedLinearModel) extModel).getModel();
if (genModel instanceof PMMLExportable) {
return ((PMMLExportable) genModel).toPMML();
} else {
throw new MLModelHandlerException("PMML export not supported for model type");
}

然后添加您自己的接口(interface)来获取此内容:

public interface PpmlModelContainer{
PMMLExportable getPMMLExportable();
}

public String exportAsPMML(MLModel model) throws MLModelHandlerException {
Externalizable extModel = model.getModel();

if (extModel instanceof PpmlModelContainer) {
PMMLExportable ppmlModel = ((PpmlModelContainer) extModel).getPMMLExportable();
return ppmlModel.toPMML();
} else {
throw new MLModelHandlerException("PMML export not supported for model type");
}
}

需要实现什么:

MLClassificationModel implements PpmlModelContainer
MLGeneralizedLinearModel implements PpmlModelContainer
MLKMeansModel implements PpmlModelContainer

系统现在为open closed 。对扩展开放,对修改关闭。

关于java - 使用instanceof运算符进行反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33165976/

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