【发布时间】:2023-03-19 18:30:01
【问题描述】:
我遇到过不同的帖子,其中说使用 instanceof 不是一种好的做法。
http://www.javapractices.com/topic/TopicAction.do?Id=31 https://www.artima.com/interfacedesign/PreferPoly.html
我的情况是,我有一个序列化对象,它可以是 7,8 种实际类型。现在我正在使用insntanceof 运算符并使用各种 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");
}
}
【问题讨论】:
-
你能把你的代码贴在你用过
instanceof的地方吗? -
您可以将类型存储为成员
-
没有实际代码很难得到清晰的图片。但根据您的设计,instanceof 可能是一个有效的解决方案。您也可以使用泛型进行设计
-
我已添加代码
-
这需要基类/通用接口。
标签: java instanceof