java - 构建客户端 REST 库最惯用的方法是什么?

标签 java rest sdk access-modifiers idioms

我正在编写一个 REST API。我想将我的类分成整齐的小文件夹,但我仍然希望它们都具有彼此的包访问权限。

这样做的原因是我只希望一个类具有公共(public)访问权限。

示例:

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

最惯用的方法是什么?

最佳答案

表达代码内容(即 Java 约定)的最惯用方法是为代码提供三个包:com.mysuper.sdkcom.mysuper.sdk.models & com.mysuper.sdk.controllers

话虽如此,Java 语言规范(2015 年 9 月)中没有任何地方要求包名称反射(reflect)底层文件夹结构。举个例子:

./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. 它将鼓励您更好地封装代码,以区分代码模块的职责。

如果您想在遵循 Java 最佳实践的同时获得类似的结果,我鼓励您遵循 Michael Aaron Safyan 的建议并熟悉 Factory Method pattern从公共(public)接口(interface)中抽象出 SDK 的实现。

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

关于java - 构建客户端 REST 库最惯用的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32408808/

相关文章:

java - 创建没有描述的 SchemaCrawler 图

java - 可以解析内容uri

javascript - WebAPI 和 401 与 200

OS X 10.9 SDK 中缺少 Python.framework。为什么?还有 : Workaround?

JAVA:parseInt 问题

java - 在 primefaces 时间表上每天显示可编辑的事件

python - Flask:如何在 session 中存储凭据并检索它们?

php - 适用于移动设备的 REST Web API - CSRF 保护?

java - Wacom 集成到 java 中

android - 继续收到 SDK 错误信息