我正在编写一个 REST API。我想将我的类分成整齐的小文件夹,但我仍然希望它们都具有彼此的包访问权限。
这样做的原因是我只希望一个类具有公共(public)访问权限。
示例:
+---com.mysuper.sdk
|
+------ models
| |---- Model.java
+------ controllers
| |---- Controller.java
|
+---PublicAPI.java
- PublicAPI.java 需要能够查看所有模型和 Controller 。
- Controller 需要能够查看模型。
- 使用我的库的任何人都应该只能看到 PublicAPI.java
最惯用的方法是什么?
最佳答案
表达代码内容(即 Java 约定)的最惯用方法是为代码提供三个包:com.mysuper.sdk
、com.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
综上所述,有几个原因说明您应该坚持将类组织到单独的包中。
- 大多数 IDE 会将与文件夹结构不相关的包视为致命编译错误。
- 这是一种约定,因为它有助于提高代码的可读性,引导其他开发人员访问包含您的类的文件夹。
- 它将鼓励您更好地封装代码,以区分代码模块的职责。
如果您想在遵循 Java 最佳实践的同时获得类似的结果,我鼓励您遵循 Michael Aaron Safyan 的建议并熟悉 Factory Method pattern从公共(public)接口(interface)中抽象出 SDK 的实现。
如何最好地为您的项目实现上述模式最好留给另一个问题。
关于java - 构建客户端 REST 库最惯用的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32408808/