首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么不允许多个实现在module-info.java中声明为模块服务?

在Java 9中引入了模块化系统,其中module-info.java文件用于声明模块的信息,包括依赖关系和对外提供的服务。在模块中,可以通过使用provides关键字将接口的实现类声明为模块服务,以供其他模块使用。

然而,Java 9不允许在module-info.java中声明多个实现类作为模块服务的原因是为了保持模块的清晰性和一致性。一个模块应该有一个清晰的目标和职责,而不是承担多个不同的服务。

允许在module-info.java中声明多个实现类作为模块服务可能会导致以下问题:

  1. 模块的职责不清晰:一个模块应该专注于提供一个特定的服务,如果允许多个实现类作为模块服务,可能会导致模块的职责不明确,难以理解和维护。
  2. 依赖关系复杂:如果一个模块依赖于多个提供相同服务的模块,那么在解析依赖关系时可能会变得复杂。同时,当多个模块提供相同服务时,可能会引发冲突和不一致性。
  3. 可维护性差:当一个模块提供多个服务时,其代码和配置可能会变得复杂和混乱,难以维护和理解。

为了避免上述问题,建议在module-info.java中只声明一个实现类作为模块服务。如果需要提供多个服务,可以考虑将它们分解为不同的模块,每个模块专注于提供特定的服务。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送):https://cloud.tencent.com/product/umeng
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云游戏多媒体引擎(GME):https://cloud.tencent.com/product/gme
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java9迁移注意事项

迁移种类 1、代码不模块化,先迁移到jdk9上,好利用jdk9的api 2、代码同时也模块化迁移 几点注意事项 不可读类 比如sun.security.x509,在java9归到java.base模块...依赖所有named和unnamed module,然后导出自身的package) 一个包名不能在多个模块中出现(split packages) 因为模块可以exports指定包给其他模块,如果多个模块...不过模块系统查找模块的时候还是使用模块名来查找(如果module-path里头有多个重名模块,则模块系统知会使用找到的第一个,自动忽略后续的同名模块),版本依赖问题不在模块系统解决范畴内,交由maven...module-info.java的exports声明package只是允许该package直接所属的类允许访问其public元素,并不允许反射调用非public元素。...默认—illegal-access=permit,同时该设置只适用于java9之前的package在java9被不允许访问,不适用于java9新的不允许访问的package.

1.4K10
  • JavaSE:Java9 新特性

    Java9概述     Java发布于2017年9月发布,带来了很多新特性,其中最主要的变化是模块化系统     模块就是代码和数据的封装体,模块的代码被组织成多个包,每个包包含java类和接口,模块的数据则包括资源文件和其他静态信息...模块化的使用       语法格式         在module-info.java文件,我们可以用新的关键字module来声明一个模块。...钻石操作符的使用升级     在Java9,允许在匿名内部类的使用,使用钻石操作符     代码 4.  ...集合工厂方法       基本概念           Java9的List, Set 和 Map集合,增加了静态工厂方法of,实现不可变实例的创建           不可变体现在无法添加、删除和修改它们的元素...          不允许添加null元素对象       实际意义           保证线程安全:在并发程序,既保证线程安全性,也大大增加了并发时的效率           被不可信的类库使用时会很安全

    35520

    Java9来了,快来了解下JPMS基础吧!

    以前,代码被组织成字段(fields),方法(methods),类(classes),接口(interfaces)和包(packages),现在, Java SE 9有了一个新的结构元素 - 模块。...在Java 8的时候,开发人员可以通过将某个类的方法声明为private,这样其他类就看不到该方法了。在Java 9呢?...一个模块通常只是一个jar文件,在文件的根目录下有一个module-info.class文件,就是一个模块化jar文件。该文件是从源代码库module-info.java文件创建的。...我建议不要,因为module-info.java文件包含API的绑定部分,最好用.java代码表示,而不是像pom.xml这样的元数据。 总结 不要对Java 9的JPMS - 模块感到太兴奋。...以上只是对module-info.java文件可能的内容和JPMS的限制的总结。如果你正在考虑模块化您的lib或应用程序,请等一会儿,直到所有内容变得更清晰再说吧!

    2.8K80

    Java 9的模块系统到底怎么用

    模块的结构 Java 模块可以由一个或者多个在一起的 Java 包组成。...创建模块规则 创建模块也必须遵守下面的规则: 模块名称必须是唯一的。 模块描述符文件module-info.java 必须有。 包名称必须是唯一的。即使在不同的模块,我们也不能有相同的包名。...每个模块将创建一个 jar 文件。对于多个 jar,我们需要创建单独的模块。 一个项目可以由多个模块组成。 模块类型 模块同样还具有类型,一共有四种。 系统模块 来自 JDK 和 JRE 的模块。...使用服务 使用 uses 关键字,我们可以指定我们的模块需要或使用某些服务。这个服务通常是一个接口或抽象类。它不应该是一个实现类。...❝uses用于指定所需要的服务类或者接口。 给予服务 我们可以通过 provides ... with ...语法,在模块声明一些服务的实现供其它模块(通过uses)使用。

    1.3K10

    【Java】A Guide to Java 9 Modularity

    模块的命名规则类似于我们命名包的方式(允许使用点,不允许使用破折号)。比如:项目风格(my.module)反向DNS(com.baeldung.ymodule)下文的案例将会一直使用项目风格介绍。...The default is permit.module-path - 我们使用 module-path 选项来指定模块路径。包含比如一个模块的一个或多个目录的列表。...Now, we need to tell the world that our module provides this service.现在需要对外公开自己支持某些服务。...In our main.app module, let's add the following to our module-info.java:接下来,我们需要使用这个服务。...在我们的main.app模块,让我们在我们的module-info.java添加以下内容:uses com.baeldung.modules.hello.HelloInterface;Finally

    19320

    【Java 基础篇】Java 模块化详解

    可重用性差:在多个应用程序之间共享代码和资源比较困难。 安全性问题:所有的类都在同一个类路径,这可能导致意外的访问和依赖关系。 Java模块化解决了这些问题。...模块声明(Module Declaration) 一个模块声明是一个包含在module-info.java文件的文件,它定义了一个模块的名称、依赖关系和其他特性。 3....以下是一些模块化的更多操作: 导出和打包模块:您可以使用exports关键字在module-info.java声明哪些包可以被其他模块访问。这允许您控制哪些部分的代码对外可见。...版本管理:在module-info.java可以使用requires static关键字来声明可选依赖关系,这些依赖关系只在模块可用时才会生效。 这些是模块化Java应用程序的一些更多操作。...明确的依赖关系:在module-info.java文件明确声明模块的依赖关系,以确保应用程序的模块之间的依赖关系清晰可见。

    59120

    什么?Java9这些史诗级更新你都不知道?Java9特性一文打尽!

    为什么需要模块系统? 当代码库变得更大时,创建复杂、纠结的 “意大利面条代码” 的几率成倍增加。...它刚刚引入了称为 "模块" 和称为模块描述符(module-info.java)的新组件: ?...注意:每个 Java 9 模块只有一个模块和一个模块描述符。与 Java 8 包不同,我们不能在一个模块创建多个模块。...我们需要先在模块描述符(同样需要在 src 目录创建 module-info.java 文件)显式的引入我们刚才暴露出来的 com.wmyskxz.core 模块: module com.wmyskxz.client...现在将不再需要。Javadoc 现在在 API 文档本身包含了搜索功能。另外,Javadoc 输出现在兼容 HTML 5。

    1.6K20

    Java9-Java17新特性

    Java为什么要变? ​...模块路径只能包含每个模块的一个,并且每个包只能在一个模块定义。如果两个或多个模块具有相同的名称或导出相同的包,则运行时会在运行程序之前立即终止。...模块描述符是在名为module-info.java的文件定义的模块声明的编译版本。...比如现在我们创建了一个新的Maven项目: 项目演练 然后我们导入了junit框架的依赖,如果我们不创建module-info.java文件,那么就是一个未命名模块,未命名模块默认可以使用其他所有模块提供的类...final关键字,那么无论是谁,包括我们自己也是没办法实现继承的,但是现在我们有一个需求,只允许我们自己写的类继承A,但是不允许别人写的类继承A,这时该咋写?

    52720

    JDK8升级JDK11最全实践干货来了

    模块化的几点关键说明: 1)相对于JDK8的变动 JDK9以后引入了一个新组件module:模块描述符module-info.java,用于将一组相关的包放入一个组。...在Java8和更早的应用程序,应用程序将包作为顶级组件,Java9以后应用程序将模块作为顶级组件。 一个模块(Jar包)只能有一个module-info.java。...订单依赖产品,通过模块化的限制,订单只能使用产品明确对外暴露的类,这样就避免传统模式订单.jar可能依赖了产品.jar普通的类导致代码腐化的问题,也降低后续领域服务拆分的复杂度。...但是pom明明也依赖了com.alibaba.fastjson包,为什么模块化后,就找不到了呢?...拆分包始终是不正常的,而当使用解析可传递依赖项的构建工具(如Maven等)时,很容易出现同一个库的多个版本,当Java模块系统检测到一个包存在于模块路径上的多个模块时,就会拒绝启动。

    1K20

    Kotlin入门(14)继承的那些事儿

    进行演示,改写后的基类代码框架如下: open class Bird (var name:String, val sex:Int = 0) { //此处暂时省略基类内部的成员属性和方法 } 现在有了基类框架...internal : 只对本模块内部开放,这是Kotlin新增的关键字。对于App开发来说,本模块便是指App自身。 protected : 只对自己和子类开放。...因为private的限制太严厉了,只对自己开放,甚至都不允许子类染指,所以它跟关键字open势同水火。...Kotlin的接口与Java一样是为了间接实现多重继承,由于直接继承多个类可能存在方法冲突等问题,因此Kotlin在编译阶段就不允许某个类同时继承多个基类,否则会报错“Only one class may...其次,Kotlin除了常规的三个开放性修饰符public、protected、private,另外增加了修饰符internal表示只对本模块开放。

    1.6K50

    Java 9 新特性,看这里就明白了

    jdk9添加了私有方法) 6.钻石操作符升级 可以有{} 7.异常处理try升级 8.下划线标识符命名的限制 _ 不允许了 9.String底层存储结构的变更(char数组变成byte字节数组)...等等,我认为只适用于初学者学习java不用其他编辑工具就可以学习java 3、Java9新特性之---模块化 一个大型的项目,比如淘宝商城等,都会包含多个模块,比如订单模块,前台模块,后台管理模块,广告位模块...,所以,java9提供了这一个特性,某一个模块运行的时候,jvm只会启动和它有依赖的模块,并不会加载所有的模块到内存,这样性能大大的提高了。...一个项目中的两个模块模块之间通过module-info.java来关联,在IDEA编辑器右键创建package-info.java ?...然后在java9Test模块创建一个package-info.java,引入java9Demo模块导出包名 ? 这样就可以直接在java9Test引入Person实体类了,这只是一个简单的例子。

    75060

    Java 9 新特性,看这里就明白了

    jdk9添加了私有方法) 6.钻石操作符升级 可以有{} 7.异常处理try升级 8.下划线标识符命名的限制 _ 不允许了 9.String底层存储结构的变更(char数组变成byte字节数组)...等等,我认为只适用于初学者学习java不用其他编辑工具就可以学习java 3、Java9新特性之---模块化 一个大型的项目,比如淘宝商城等,都会包含多个模块,比如订单模块,前台模块,后台管理模块,广告位模块...,所以,java9提供了这一个特性,某一个模块运行的时候,jvm只会启动和它有依赖的模块,并不会加载所有的模块到内存,这样性能大大的提高了。...一个项目中的两个模块模块之间通过module-info.java来关联,在IDEA编辑器右键创建package-info.java ?...然后在java9Test模块创建一个package-info.java,引入java9Demo模块导出包名 ? 这样就可以直接在java9Test引入Person实体类了,这只是一个简单的例子。

    83560

    JavaSE学习总结(六)——接口与抽象类

    模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。...b、从多个具有相同特征的类抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。 2.3、意义 限制规定子类必须实现某些方法,但不关注实现细节。...3.1、为什么需要接口 继承:描述事物的自然属性和行为的复用。 接口:描述事物的社会属性和行为的复用。...4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。...5)、当实现一个接口时,需要将被定义的方法声明为public类型的,否则为默认访问类型,Java编译器不允许这种情况。 6)、如果没有实现接口中所有方法,那么创建的仍然是一个接口。

    63570

    这些Java9新特性,你用过吗?

    客户端API 模块化系统:Jigsaw->Modularity 解决越来越臃肿的java运行环境,主要目的在于减少内存的开销,只须必要模块,而非全部jdk模块。...代码示例 从代码结构上来看,在包名同级下多了一个module-info.java文件 ?...小总结 模块化系统是基于jar包和类之间存在的,目的在于尽可能的减少jar多余类的加载,保证整体项目运行时的效率,对于项目运行肯定有一定的积极意义。...另外,CMS 垃圾回收器已经被声明为废弃。Java 9 也增加了很多可以通过 jcmd 调用的诊断命令。 语法改进:try语句 对于写底层的人来说,try语法的改进绝对是福音。...takeWhile() 整好相反,dropWhile取出的是后面的数据 ofNullable ofNullable(T t): t可以为null iterator iterator()重载的方法 云服务

    64630
    领券