Java 使用instanceof Operator进行反序列化

Java 使用instanceof Operator进行反序列化,java,instanceof,Java,Instanceof,我遇到过不同的帖子,上面说使用instanceof被认为不是一种好的做法 我的情况是,我有一个序列化对象,它可以是7,8个实际类型。现在我正在使用instanceof操作符,并使用各种if条件检查对象是否为实际类型,然后执行一些操作 我的设计不好吗 如果是,如何在不使用instanceof的情况下解决此问题 每个对象的继承层次结构都不同,因此我很难用多态性替换它 代码 使用现有接口 然后添加您自己的接口以获得以下结果: public interface PpmlModelContainer{

我遇到过不同的帖子,上面说使用instanceof被认为不是一种好的做法

我的情况是,我有一个序列化对象,它可以是7,8个实际类型。现在我正在使用
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内部的情况下实现它。它们已经有一个要使用的接口:!