1

我正在编写一个 Eclipse 插件,我想在其中为 JDT 包资源管理器贡献一个动作。为了执行操作,必须选择两个不同的文件。因此,我在该操作的命令处理程序中检索 JDT 包资源管理器的活动选择。这就是我的问题所在。

目前,从中提取所选文件的代码IStructuredSelection涉及多个局部变量,其中包含多个 if 语句和多个返回,大约 30 行代码。当然,这段代码看起来至少有点难看。

我应该使用什么概念和/或模式来使这段代码更干净?

eclipse 平台推荐使用适配器模式。所以我想创建一个这样的pojo:

public class FooCommandArgs {

    private IFile xmlFile;
    private IFile csvFile;

    //getters and setters here ...

}

并从IStructuredSelection. 然而,这样做只会将丑陋的代码移动到其他地方。

4

1 回答 1

0

因此,正如字段名称所暗示的那样,我想从中提取的每个项目IStructuredSelection都必须满足一些条件。我的想法是为此使用bean 验证 api。pojo 将如下所示:

public class FooCommandArgs {

    @NotNull
    @FileExtension("xml")
    @Content(type=ContentType.XML, value="http://my.schema.location/schema.xsd")
    private IFile xmlFile;

    @NotNull
    @FileExtension("csv")
    private IFile csvFile;

    //getters and setters here ...

}

bean 验证 api的Validator接口提供了<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups)我可以使用的方法。我只需要自省 java bean 属性,然后为IStructuredSelectionitem 和 pojo 属性的每个组合调用该方法。如果结果是每个项目都可以分配给没有违反约束的 bean 属性,那么我可以继续处理实际命令。歧义也可以处理。

编辑:
我已经实施了这个建议,效果很好。使用这种技术,也很容易以编程方式向用户解释为什么某个命令未启用或无法执行。

我不想忘记在这一点上提到JCommander,这就是这个想法的灵感来源。

于 2013-01-17T08:35:17.980 回答