Java 使用instanceof Operator进行反序列化
我遇到过不同的帖子,上面说使用instanceof被认为不是一种好的做法 我的情况是,我有一个序列化对象,它可以是7,8个实际类型。现在我正在使用Java 使用instanceof Operator进行反序列化,java,instanceof,Java,Instanceof,我遇到过不同的帖子,上面说使用instanceof被认为不是一种好的做法 我的情况是,我有一个序列化对象,它可以是7,8个实际类型。现在我正在使用instanceof操作符,并使用各种if条件检查对象是否为实际类型,然后执行一些操作 我的设计不好吗 如果是,如何在不使用instanceof的情况下解决此问题 每个对象的继承层次结构都不同,因此我很难用多态性替换它 代码 使用现有接口 然后添加您自己的接口以获得以下结果: public interface PpmlModelContainer{
instanceof
操作符,并使用各种if条件检查对象是否为实际类型,然后执行一些操作
我的设计不好吗
如果是,如何在不使用instanceof
的情况下解决此问题
每个对象的继承层次结构都不同,因此我很难用多态性替换它
代码
使用现有接口 然后添加您自己的接口以获得以下结果:
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
该系统现在正在运行。打开可扩展,关闭可修改。使用现有接口 然后添加您自己的接口以获得以下结果:
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
该系统现在正在运行。打开可扩展,关闭可修改。虽然使用
instanceof
被认为是一种代码气味,但情况并非总是如此。如果在做任何事情之前确实需要知道对象的类型,那么instanceof
是一个不错的选择
但是拥有大量的方法,并根据类型调用单独的方法(使用强制转换)不是一个好的选择。在这种情况下,我们需要重新考虑层次结构和可能的重构
在您的例子中,似乎可以有一个具有方法
toPMML
的基本接口,该方法可以由所有具体类实现。这实际上就是我们所说的程序到接口的意思
虽然使用instanceof
被认为是一种代码气味,但情况并非总是如此。如果在做任何事情之前确实需要知道对象的类型,那么instanceof
是一个不错的选择
但是拥有大量的方法,并根据类型调用单独的方法(使用强制转换)不是一个好的选择。在这种情况下,我们需要重新考虑层次结构和可能的重构
在您的例子中,似乎可以有一个具有方法
toPMML
的基本接口,该方法可以由所有具体类实现。这实际上就是我们所说的程序到接口的意思
你能把你的代码贴在你使用过实例的地方吗?你可以把类型存储为一个成员,没有实际的代码很难得到清晰的图像。但根据您的设计,instanceof可能是一个有效的解决方案。您也可以使用genericsI添加了代码这是一个基本类/通用接口。您可以将代码发布在使用了instanceof
的地方吗?您可以将类型存储为成员如果没有实际代码,很难获得清晰的图片。但根据您的设计,instanceof可能是一个有效的解决方案。您也可以使用Generics进行设计我已经添加了代码这要求基本类/公共接口。但是kmeansModel和LogisticRegressionModel没有扩展GeneralizedLineArmodLok,我添加了一个接口选项并将其扩展到您的整个问题。问题是LogisticRegressionModel,LinearRegressionModel等来自spark MLlib,我必须在不修改spark内部的情况下实现它。它们已经有一个要使用的接口:!但是kmeansModel和LogisticRegressionModel并没有扩展GeneralizedLineArmodLok,我添加了一个接口选项,并将其扩展到您的整个问题中。问题是LogisticRegressionModel、LinearRegressionModel等都来自spark MLlib,我必须在不修改spark内部的情况下实现它。它们已经有一个要使用的接口:!