我可以在不制作所有方法/属性 public 的情况下使用包吗?

Can I use packages without making all of the methods/ attributes public?

我有一个大约有 10 classes 的项目。为了清楚起见,我将一些 classes 移到了一个包中。 classes 之间有没有数据泄漏的安全连接方式? -使用 public 是危险的,因为任何人都可以更改它。

在我将一些 class 移到单独的包后,我使用的每个方法/属性都必须 public/ 有一个 getter。引用字段的 getter 可能会产生问题,以及将所有内容置于 'public' 可见性。

例如我有 Handler class (不在字符包中)。此处,玩家 class 使用处理程序的字符列表。

public class Handler {
    LinkedList<GameObject> objects = new LinkedList<>();
    ...
}

package player;
...
public class Player extends GameObject{
    ...
    private void collision() {
        for (GameObject tempObj : handler.objects) {
            ...             
        }

    }
...
}

谢谢!

Is there a way to connect between classes without data leaks?

这正是可见性修饰符的用途! 默认情况下将所有内容设置为私有,然后 "unprivate" 随时进行:

  • 特定字段的获取器和(可能)设置器(有时创建一个值 "setable" 而不是通过构造函数设置它可能不明智)
  • 分而治之/拆分:编写小的可见(可能是public,可能是包可见的)方法调用包含逻辑
  • 的私有方法

使用良好的 IDE 会有所帮助,因为它会建议更改不必要的 public 可见性以降低可见性。我使用 IntelliJ - 它甚至可以让您为生成的方法定义默认可见性。

在两个不同的实例之间共享数据/类/一般情况下是危险的,你不能断言数据不会泄漏,但你至少可以确保你的数据尽可能受到保护

希望这能回答您的问题:)

据我所知,在 java 中您可以在包外访问的唯一内容是标记为 public 的内容。我不认为有任何规则,比如对嵌套包的特殊访问(参见 here )。
我不知道你有多想保护你的 类,但也许你可以添加某种 authentification/code 以便能够使用那些 public 方法(或者至少在初始化时).