gpt4 book ai didi

java - 如何在Java模块中使模块私有(private)方法

转载 作者:行者123 更新时间:2023-12-01 18:38:58 24 4
gpt4 key购买 nike

我想创建一个 Java IPC 服务器模块(使用 Jigsaw),它有两个包:

  • com.example.ipc.backend
  • com.example.ipc.backend.api

在我的module-info.java中,我有以下导出:

module ipclib {
exports com.example.ipc.backend.api;
}

我可以毫无问题地将这个模块导入到我的 JavaFX GUI 模块中,但在 api 模块内创建类时遇到问题。

我在这个类中有一个接口(interface),GUI 模块中的某个类应该实现该接口(interface),以注册自身以适应 IPC 模块中的更改(例如,当客户端连接到 IPC 服务器时):

public interface IpcCallback {
void clientConnected(Client client);
}

实现此接口(interface)的类应该接收一个Client,其中包含有关已连接客户端的信息。此 Client 类还在内部保存对持有客户端套接字的线程的引用。

public class Client {
private IpcConnection connection; //IpcConnection is from com.example.ipc.backend

public Client(IpcConnection connection) {
this.connection = connection;
}
}

我现在的问题是,每当创建新连接时,我想在非导出的 backend 模块中创建一个 Client 实例。如何使构造函数只能在模块内访问,而不将其公开?

如果我将构造函数公开,IntelliJ 会提供使用构造函数在 GUI 模块中创建新的 Client 对象,但无法访问 IpcConnection 类。它提供了导出 backend 模块的快速修复,但这不是我在导出 api 时想要的。

因此,我想知道这是否仍然是“允许的”,因为Java编译器编译此操作时没有任何警告和问题,而这只是IntelliJ的问题。或者不应该这样做?

但是如果这不是允许的方式,我想知道为什么模块系统实际上只允许导出某些包,因为导出的包和未导出的包之间总是存在边界(除非不导出)导出的类是从导出的类内部调用的,但反之则不然)。

最小项目

模块“后端”

// backend/src/main/java/module-info.java
module ipclib {
exports com.example.ipc.backend.api;
}
// backend/src/main/java/com/example/ipc/backend/IpcConnection.java
package com.example.ipc.backend;

public class IpcConnection {
}
// backend/src/main/java/com/example/ipc/backend/api/Client.java
package com.example.ipc.backend.api;

import com.example.ipc.backend.IpcConnection;

public class Client {
private IpcConnection connection;
public Client(IpcConnection connection) {
this.connection = connection;
}
public String hello() {
return "Hello";
}
}
// backend/src/main/java/com/example/ipc/backend/api/IpcCallback.java
package com.example.ipc.backend.api;

public interface IpcCallback {
void clientConnected(Client client);
}

模块“gui”

// gui/src/main/java/module-info.java
module gui {
requires ipclib;
}
// gui/src/main/java/com/example/ipc/gui/App.java
package com.example.ipc.gui;

import com.example.ipc.backend.api.Client;
import com.example.ipc.backend.api.IpcCallback;

public class App implements IpcCallback {
public static void main(String[] args) {

}
@Override
public void clientConnected(Client client) {
System.out.println(client.hello());
}
}

最佳答案

我认为,这在java中是不可能的。您不能声明“在命名空间 A 及其所有子命名空间中可见”的接口(interface)。

与.net相比,Java并不真正了解“内部”原理。如果您只是在接口(interface)或类定义中省略单词 public,则该元素仅在其当前包内可见。

但这不是递归的,就像在 .net 中一样(您在其中创建一个内部对象,该对象仅在当前项目内部可见,无论在哪个子文件夹或命名空间中)。

在 Java 中,对象仅在其当前包(即完全相同的命名空间)内可见。不包括子命名空间。父命名空间也不是。

关于java - 如何在Java模块中使模块私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59982776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com