如何使用Enums的简单性设计易于扩展的API?

Riy*_*lla 7 java api frameworks exif

对不起,标题含糊不清; 我想不出如何更清楚地说出来.以下是问题的重点:

强调

  • 询问有关ExifTool for Java库的API设计问题.
  • 以下是当前API 的示例.
  • 作为USER,API使用起来非常简单,因为您只需传入Enums以获取您想要的图像元数据.
  • 作为DEV,API有点糟糕,因为您无法使用更多Enum类型轻松扩展基类以支持lib中可能不直接支持的其他元数据.
  • 简单地预定义和支持" 所有元数据 "并非易事.

鉴于设置信息,我所追求的是试图找到一种方法来预先定义人们通常想要从他们的图像中获得的30或40个最常见的元数据标记; 现在一切都被定义为枚举,但是这种类不可扩展.

如果我使用"每元数据类标记"路由,则可扩展性将很简单,但是开箱即用的API将不那么友好.

如果闭包提供了一个非常漂亮和简单的解决方案,我会考虑制作这个Java 8+库的v2.0,否则我显然更愿意让它与更多系统(Java 6/7)兼容而不是更少.

摘要

我对库的目标是"易于使用和扩展" - 我觉得我已经在1.x版本中使用了"简单易用"的方面,但是库不容易扩展,我想在2.x系列.

我已经坐在2.x版本上超过一年等待灵感罢工,它已经躲过了我; 我希望有人可以发现我的错误,我可以以非常优雅的方式向前移动lib.

谢谢你们的时间!

And*_*rea 6

Java枚举不可扩展,但它们可以实现接口.

您通常可以通过定义提供程序可以实现的接口以及实现它的枚举来实现两全其美,并包含用户可以直接使用的常用实例:

public interface Pet {
    public String talk();
}
Run Code Online (Sandbox Code Playgroud)
public enum CommonPet implements Pet {
    CAT("Meow!"),
    DOG("Woof! Woof!");

    private final String cry;

    CommonPet(String cry) {
        this.cry = cry;
    }

    @Override
    public String talk() {
        return cry;
    }
}
Run Code Online (Sandbox Code Playgroud)

用于接受原始枚举实例的API现在应该接受任何接口实例.

用户可以使用相同的模式提供自己的实现:

public enum UncommonPet implements Pet {
    LION;

    @Override
    public String talk() {
        return "Roar!";
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,并不要求所有实现都应该是枚举,因此在更复杂的情况下,用户可以选择将接口实现为完整的类:

public class Parrot implements Pet {
    private String phrase = "Pieces of eight!";

    @Override
    public String talk() {
        return phrase;
    }

    public void teach(String phrase) {
        this.phrase = phrase;
    }
}
Run Code Online (Sandbox Code Playgroud)