Java模块:可以访问对象,但无法创建对象

Java模块:可以访问对象,但无法创建对象,java,module,visibility,instantiation,Java,Module,Visibility,Instantiation,假设我有两个模块 一个叫“接收者”,一个叫“修改者” 在Receiver模块中,我有一个名为“com.danii.Receiver”的包,其中有一个名为“DataReceiver”的类。我在Receiver模块中有另一个名为“com.danii.Entities”的包,其中有一个名为“Data”的类。接收器模块当前仅导出com.danii.Receiver 当我在DataReceiver类中运行函数时,它将创建一个新的数据对象,并将其发送回 在我的修改器模块中,我将其设置为需要com.danii

假设我有两个模块

一个叫“接收者”,一个叫“修改者”

在Receiver模块中,我有一个名为“com.danii.Receiver”的包,其中有一个名为“DataReceiver”的类。我在Receiver模块中有另一个名为“com.danii.Entities”的包,其中有一个名为“Data”的类。接收器模块当前仅导出com.danii.Receiver

当我在DataReceiver类中运行函数时,它将创建一个新的数据对象,并将其发送回

在我的修改器模块中,我将其设置为需要com.danii.Receiver,并且我希望通过DataReceiver接收一些数据。我尝试这样做,但无论我做什么,我都无法读取它,因为它没有访问数据类的权限


我如何能够读取DataReceiver提供给我的数据,但仍然无法创建数据?

允许您保留当前结构的大部分方面的一个选项是使用另一个导出包,该包带有由数据实现的接口(我现在称之为IData)。然后DataReceiver可以返回IData对象(实现仍然是通过数据类)。IData可以在其自己的导出包中,也可以在您已经导出的接收方包中。

导出只是过程的一半。修改器模块需要声明
需要com.danii.Receiver在其模块info.java中。我已经这样做了,我可能应该澄清一下,对不起@VGR.Ah,我现在明白了。您必须导出希望其他模块可以访问其类的每个包。因此,您需要导出com.danii.Entities除了导出com.danii.Receiver之外。@VGR这样做将使数据能够实例化。正如我所说,我不希望修改器模块能够创建数据,只接收它。我明白了。我以为您在问为什么不能实例化数据,但实际上您在问如何防止其他模块实例化数据。在这种情况下,Ryan的答案是正确的(除了您永远不应该在接口名称前面加上
I
)。