这是一个概念问题。
我通常按逻辑将代码组织在包中。例如:数学运算进入my.package.math
或业务逻辑进入my.package.business
等等。
在这些日子里,我有一个疑问,我想分享关于java中包可见性强加的约束。
让我展示一些代码来更好地解释我的情况:我有以下包结构:
+-- org.example
+-- greetings
| +-- RandomGreetings
+-- GreetingsService
|
+-- Main
和以下代码:
问候服务.java
package org.example;
import org.example.greetings.RandomGreetings;
public class GreetingsService {
public String greetingsToTheWorld(){
RandomGreetings greetings = new RandomGreetings();
return greetings.say() + " World";
}
}
RandomGreetings.java
package org.example.greetings;
import java.util.Random;
class RandomGreetings {
public String say() {
Random rand = new Random();
int value = rand.nextInt(2);
return value==0 ? "Hello" : "Hi";
}
}
主.java
package org.example;
public class Main {
public static void main(String[] args) {
GreetingsService sayHelloService = new GreetingsService();
System.out.println(sayHelloService.greetingsToTheWorld());
}
}
正如我向您展示的那样,此代码无法编译,因为该类RandomGreetings
是包可见的,这意味着 GreetingsService 无法实例化它。这个问题可以在课堂上公开RandomGreetings
解决:
public class GreetingsService {
...
}
但RandomGreetings
对我来说,这是一个我想保持封装而不公开可见的实现。在这种情况下,世界(任何导入我可能生成的 jar 工件的人)都能够看到并调用该类,这不是我想要的。
另一种可能的解决方案是GreetingsService
在 RandomGreetings 的同一级别移动,如下所示:
+-- org.example
+-- greetings
| +-- RandomGreetings
| |
| +-- GreetingsService
|
+-- Main
在这种情况下,代码编译成功并被RandomGreetings
封装,但我最终遇到了另一个问题。
我无法按逻辑顺序组织包中的那个类。
在这种情况下,有几个班级,所以情况仍然可以控制,但如果班级数量增加,我认为只会有一个独特的大包。
我知道在 Java 中没有subpackage visibility,那么您如何处理这种情况?
你将如何解决我上面的代码的问题?