Java 9 中的 require 和 require 传递语句有什么区别?

2024-03-03

有什么区别requires and 需要传递性模块声明中的模块语句?

例如:

module foo {
    requires java.base;
    requires transitive java.compiler;
}

可读性回顾

如果模块bar requires module drink,然后模块系统...

  • 强制存在drink(称为可靠的配置)
  • allows bar读书drink(称为可读性 https://blog.codefx.org/java/java-module-system-tutorial/#dependencies-readability)
  • 允许代码进入bar访问导出包中的公共类drink(称为可达性 https://blog.codefx.org/java/java-module-system-tutorial/#exports-accessibility)

如果发生完全相同的情况bar requires transitive drink - drink必须存在、可以读取和访问。事实上,对于bar and drink the transitive关键字不会改变任何东西。

隐含的可读性

模块根据bar是那些受到影响的人transitive:任何读取的模块bar还可以阅读drink。换句话说,可读性drink is implied(这就是为什么这被称为隐含的可读性 https://blog.codefx.org/java/implied-readability/)。一个后果就是customer可以访问drink的类型。

So if bar requires transitive drink and customer requires bar, then customer可以阅读drink即使它没有明确依赖它。

用例

但为什么?想象一下,您有一个模块,其公共 API 接受或返回另一个模块的类型。让我们说bar模块公开返回实例Drink,一个接口来自drink module:

// in module _bar_
public class Bar {

    // `Drink` comes from the module _drink_,
    // which _bar_ requires
    public Drink buyDrink() { /* ... */ }

}

在这个例子中,bar使用常规的requires for drink。现在说,customer依赖于取决于bar,所以它的所有代码都可以调用Bar::buyDrink。但当它发生时会发生什么呢?

模块系统抱怨说customer不读drink因此无法访问Drink。为了解决这个问题,customer还必须依赖于drink。多么苦差事啊!不能立即使用的酒吧有多无用?

因此,引入了隐含的可读性:使在其自己的公共 API 中使用另一个模块类型的模块立即可用without要求调用者寻找并要求所有涉及的模块。

So if bar requires transitive drink, customer无需购买饮料即可开始购买require drink - require bar就足够了。正如它应该。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 9 中的 require 和 require 传递语句有什么区别? 的相关文章

随机推荐

  • 无法在 Visual Studio 2010 中调试 MVC 源代码

    我正在尝试使用 Microsoft 符号服务器在 Visual Studio 2010 中调试 MVC 源代码 我已经配置了调试选项 如下所示 我的项目面向 NET Framework 4 0 如中所述调试 NET Framework 的源
  • 如何在 CMake 中使用 c++20 模块?

    Clang http clang llvm org docs Modules html and MSVC http blogs msdn com b vcblog archive 2015 12 03 c modules in vs 201
  • PHPUnit:模拟除某些方法之外的所有方法

    我正在编写一个 PHPUnit 测试 我需要模拟一些依赖项 但我需要一些方法才能使其仍然像以前一样工作 即 我有 class Dependency some stuff not important for the test public f
  • Rails 中两个表充当一个模型

    Rails 是否可以在依赖于两个表的联接的模型上进行设置 这意味着要找到 更新 销毁模型记录 需要将两个数据库表中的两条记录通过联接链接在一起 该模型只是将两个表的所有列包装在一起 然后可用于表单等 这样 当模型被创建 更新时 它只是一种应
  • 为 Mips 架构编译 C

    我已经看到了几种方法来做到这一点 到目前为止我还没有尝试过几种 但我想为了方便起见隔离这个方法 应该有一种方法可以通过 VIA gcc 来做到这一点 我更喜欢这个 我只是不断碰壁 我正在使用 debian7 并且可以使用其他任何风格 我暂时
  • 有人知道托管 TeamCity 构建提供商吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望建立一个 TeamCity 服务器来持续构建 NET Web 应用程序 我已经有了托管 所以我不想
  • 如何使用 PHP 将 base64 编码的二进制数据保存到 zip

    我从 API 请求响应中获取 Base64 二进制编码数据 我需要将其保存为 zip 文件 我使用如下代码
  • git-svn 可以像本地 subversion 客户端一样处理 CRLF 吗?

    我有一个托管在 Linux 上的 Subversion 存储库 但只能通过 Windows 客户端访问 因为它是大型 Windows 应用程序的源代码 如果我可以使用 git svn 由 msysgit 提供 处理这个存储库 那就太棒了 我
  • 在同一位置绘制顶点

    有没有一种方法可以在同一位置绘制两个图的共享节点 例如 两张图 g1 graph ring 5 V g1 name c node1 node2 node3 node4 node5 g1 g1 V g1 1 g2 graph ring 5 V
  • 更有效地编写 HTTP 脚本

    很多时候我想自动化 http 查询 我目前使用 Java 和 commons http 客户端 但可能更喜欢基于脚本的方法 事情真的又快又简单 我可以在其中设置标头 转到页面 而不必担心设置整个 OO 生命周期 设置每个标头 调用 html
  • GWT 2.4.0 RequestFactory 多态性

    GWT 2 4是否支持这种情况 Entity class MyBase Entity class MyChild1 extends MyBase Entity class MyChild2 extends MyBase ProxyFor M
  • 如何在 Remix.run 开发模式下使用内存缓存?

    我需要从一个非常慢且很少变化的 API 获取数据 所以我想我应该使用内存缓存 我首先尝试了一种非常简单的方法 只需将其保存到路径中加载器函数范围之外的变量中 let cache export const loader async gt if
  • 将两个集合与范围条件组合起来

    我有一个集合 产品 其中包含如下文档 id 142347106 name product 1 id 135377126 name product 2 我还有另一个系列 价格 id ObjectId 59310a6bad6e99863c2a6
  • MySQL 与实体框架 6

    我一直在尝试为我的 MySQL 服务器添加 EF 模型 但没有机会 因为它要么在为我的项目选择实体框架版本之前关闭 要么给出 您的项目引用了最新版本的实体框架 但是 无法为您的数据连接找到与此版本兼容的实体数据库提供程序 错误 并且我无法为
  • 针对 Python Web 开发的 TDD 资源 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我不是一名黑客 也不是一名全职程序员 但我希望开始我自己的完整应用程序开发实验 如果我在这里错过了一些简
  • 从 io.Reader 到 Go 中的字符串

    我有一个io ReadCloser对象 来自http Response目的 将整个流转换为最有效的方法是什么string object EDIT 从 1 10 开始 strings Builder 就存在了 例子 buf new strin
  • 如何在测试 FastAPI 应用程序时触发生命周期启动和关闭?

    作为 FastAPI 的新手 我正在努力测试比我在教程中看到的稍微困难的代码 我用fastapi cache模块和Redis是这样的 from fastapi import Depends FastAPI Query Request fro
  • 如何仅在Android移动设备中而不是在数据库中获取macid和手机号码

    如何仅在Android移动设备中而不是在数据库中获取macid和手机号码 try this WifiManager manager WifiManager getSystemService Context WIFI SERVICE Wifi
  • queryselectorAll - 查找具有多个匹配类的元素

    使用 JS queryselectorall 方法可以选择具有 2 个匹配类的特定标记名称的元素 例如 我有一个元素 a class classOne classTwo a 使用 queryselectorall 我可以选择一个类名 doc
  • Java 9 中的 require 和 require 传递语句有什么区别?

    有什么区别requires and 需要传递性模块声明中的模块语句 例如 module foo requires java base requires transitive java compiler 可读性回顾 如果模块bar requi