如何在保存封装的同时将代码逻辑地组织到包装中



这是一个概念问题。
我通常从逻辑上在包装中组织代码。例如:数学操作以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类本身,因为它仍然是"包装可见"。

相关内容

  • 没有找到相关文章

最新更新