这是一个概念问题。
我通常从逻辑上在包装中组织代码。例如:数学操作以my.package.math
或业务逻辑进入my.package.business
等。
在这几天我有疑问,我想分享有关 package convibility 在Java中施加的约束。
让我显示一些代码以更好地解释我的情况:我有以下软件包结构:
+-- org.example
+-- greetings
| +-- RandomGreetings
+-- GreetingsService
|
+-- Main
和以下代码:
engeringsService.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";
}
}
main.java
package org.example;
public class Main {
public static void main(String[] args) {
GreetingsService sayHelloService = new GreetingsService();
System.out.println(sayHelloService.greetingsToTheWorld());
}
}
正如我向您展示的那样,此代码不会编译,因为RandomGreetings
类可见类,这意味着GreetingsService无法实例化。可以解决此问题 public 在类RandomGreetings
中:
public class GreetingsService {
...
}
,但对我来说,RandomGreetings
是我想保持封装而不是公共可见的实现。在这种情况下,世界(任何导入罐子的人可能会产生的人(都能看到并称呼该类别,这不是我想要的。
另一个可能的解决方案是在相同级别的随机旋转中移动GreetingsService
,例如:
+-- org.example
+-- greetings
| +-- RandomGreetings
| |
| +-- GreetingsService
|
+-- Main
在这种情况下,代码成功编译,RandomGreetings
被封装,但我最终遇到了另一个问题。
我无法以逻辑顺序在包装中组织该类。
在这种情况下,有几个课程,因此情况仍然可以管理,但是如果班级增加数量,我认为只有一个独特的大包。
我知道在Java中没有子包的可见性,那么您如何管理这种情况?
您如何解决上面的代码问题?
当您要使用软件包时,它必须具有一些入口点,必须是public
。否则,您可以将包装丢弃,因为它无法使用。这意味着您的org.example.greetings
软件包必须具有public
的东西,并且可以从"外部"使用/调用。它不必是您的RandomGreetings
课程。
您可以定义一个接口(在org.example
软件包中(,在RandomGreetings
类中实现它,并使用另一种public
方法来创建并返回"包装可见" RandomGreetings
类。代码可能看起来像这样:
package org.example;
public interface Greeting {
public String say();
}
这是由RandomGreetings
类实现的:
package org.example.greetings;
import org.example.Greeting;
class RandomGreetings implements Greeting {
// ...
}
然后,您定义public
助手类以从org.example.greetings
软件包返回RandomGreetings
对象:
package org.example.greetings;
import org.example.Greeting;
public GeneratorHelper {
public static Greeting buildIt() {
return new RandomGreetings();
}
}
使用GeneratorHelper.buildIt()
方法时,您会获得一些实现Greeting
接口的对象。但是您无法访问RandomGreetings
类本身,因为它仍然是"包装可见"。