构建客户端 REST 库的最惯用方式?

most idiomatic way to structure a client side REST library?

我正在编写 REST API。我想将我的 classes 分成整洁的小文件夹,但我仍然希望它们都可以相互访问包。

这样做的原因是我想要一个 class 只具有 public 访问权限。

示例:

+---com.mysuper.sdk
|
+------ models
|          |---- Model.java
+------ controllers
|          |---- Controller.java
|
+---PublicAPI.java
  1. PublicAPI.java 需要能够看到所有模型和控制器。
  2. 控制器需要能够看到模型。
  3. 任何使用我的图书馆的人应该只能看到 PublicAPI.java

最惯用的方法是什么?

最惯用的方式来表达你的代码,意思是 Java 约定,是为你的代码提供三个包:com.mysuper.sdkcom.mysuper.sdk.modelscom.mysuper.sdk.controllers .

也就是说,Java 语言规范(2015 年 9 月)中没有任何地方要求包名称反映底层文件夹结构。举个例子:

./src/com/mysuper/sdk/PublicAPI.java

package com.mysuper.sdk;

// Public class.
public class PublicAPI {
    // Main method.
    public static void main(String... args) {
        int[] numbers = new int[args.length];

        for (int i = 0; i < args.length; i++) {
            numbers[i] = Integer.parseInt(args[i]);
        }

        System.out.println(new Controller().translateNumbers(numbers));
    }
}

./src/com/mysuper/sdk/controllers/Controller.java

package com.mysuper.sdk;

// Package protected class.
class Controller {
    // Private model.
    private Model model = new Model();

    // Package protected method.
    String translateNumbers(int... numbers) {
        String translation = "";
        for (int number : numbers) {
            translation = translation + model.get(number) + " ";
        }
        return translation;
    }
}

./src/com/mysuper/sdk/models/Model.java

package com.mysuper.sdk;

// Package protected class.
class Model {
    // Private database.
    private String[] database = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

    // Package protected method.
    String get(int number) {
        if (number < 0 || number > 9) {
            throw new NumberFormatException("Number " + number + " is not between 0 and 9.");
        } else {
            return database[number];
        }
    }
}

javac 编译这段代码不会抛出任何语法错误,因为代码在语法上是正确的。亲自尝试一下:

javac -d bin ./src/com/mysuper/sdk/PublicAPI.java \
./src/com/mysuper/sdk/controllers/Controller.java \
./src/com/mysuper/sdk/models/Model.java

java -cp ./bin com.mysuper.sdk.PublicAPI 0 1 2 3 4 5 6 7 8 9

您应该得到如下输出:

zero one two three four five six seven eight nine

综上所述,有几个原因表明您应该坚持将 类 组织到单独的包中。

  1. 大多数 IDE 会将与您的文件夹结构不相关的包视为致命编译错误。
  2. 这是惯例,因为它有助于提高代码的可读性,引导其他开发人员访问包含您的 类.
  3. 的文件夹
  4. 这将鼓励您更好地封装代码以分离代码模块的职责。

如果您想在遵循 Java 最佳实践的同时获得类似的结果,我鼓励您遵循 Michael Aaron Safyan 的建议并熟悉 Factory Method pattern 以抽象化您的 SDK 的实现从您的 public 界面。

如何最好地为您的项目实施所述模式最好留给另一个问题。