blob: 034cac2e9275d5f4b37e62da75ebd7e5a34319e1 [file] [log] [blame]
<!DOCTYPE html>
<html lang="zh" dir=ZgotmplZ>
<head>
<link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css">
<script src="/bootstrap/js/bootstrap.bundle.min.js"></script>
<link rel="stylesheet" type="text/css" href="/font-awesome/css/font-awesome.min.css">
<script src="/js/anchor.min.js"></script>
<script src="/js/flink.js"></script>
<link rel="canonical" href="https://flink.apache.org/zh/how-to-contribute/code-style-and-quality-scala/">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Code Style and Quality Guide — Scala # 序言 # Pull Requests &amp; Changes # 常用编码指南 # Java 语言指南 # Scala 语言指南 # 组件指南 # 格式指南 # Scala 语言特性 # 在哪儿使用(和不使用) Scala # 对于 Scala 的 API 或者纯 Scala libraries,我们会选择使用 Scala。
在 core API 和 运行时的组件中,我们不使用 Scala。我们的目标是从这些组件中删除现有的 Scala 使用(代码和依赖项)。
⇒ 这并不是因为我们不喜欢 Scala,而是考虑到“用正确的工具做正确的事”的结果(见下文)。
对于 API,我们使用 Java 开发基础内容,并在上层使用 Scala。
这在传统上为 Java 和 Scala 提供了最佳的互通性 这意味着要致力于保持 Scala API 的更新 为什么我们不在 Core API 和 Runtime 中使用 Scala ?">
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="Code Style and Quality Guide — Scala" />
<meta property="og:description" content="Code Style and Quality Guide — Scala # 序言 # Pull Requests &amp; Changes # 常用编码指南 # Java 语言指南 # Scala 语言指南 # 组件指南 # 格式指南 # Scala 语言特性 # 在哪儿使用(和不使用) Scala # 对于 Scala 的 API 或者纯 Scala libraries,我们会选择使用 Scala。
在 core API 和 运行时的组件中,我们不使用 Scala。我们的目标是从这些组件中删除现有的 Scala 使用(代码和依赖项)。
⇒ 这并不是因为我们不喜欢 Scala,而是考虑到“用正确的工具做正确的事”的结果(见下文)。
对于 API,我们使用 Java 开发基础内容,并在上层使用 Scala。
这在传统上为 Java 和 Scala 提供了最佳的互通性 这意味着要致力于保持 Scala API 的更新 为什么我们不在 Core API 和 Runtime 中使用 Scala ?" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://flink.apache.org/zh/how-to-contribute/code-style-and-quality-scala/" /><meta property="article:section" content="how-to-contribute" />
<title>Code Style and Quality Guide — Scala | Apache Flink</title>
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="alternate" hreflang="en" href="https://flink.apache.org/how-to-contribute/code-style-and-quality-scala/" title="Code Style and Quality Guide — Scala">
<link rel="stylesheet" href="/book.min.22eceb4d17baa9cdc0f57345edd6f215a40474022dfee39b63befb5fb3c596b5.css" integrity="sha256-IuzrTRe6qc3A9XNF7dbyFaQEdAIt/uObY777X7PFlrU=">
<script defer src="/zh.search.min.4fed8368d7410bf2cb8853d136d796128533433358adcd85133b7d8014ce76ef.js" integrity="sha256-T&#43;2DaNdBC/LLiFPRNteWEoUzQzNYrc2FEzt9gBTOdu8="></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
-->
<meta name="generator" content="Hugo 0.124.1">
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['disableCookies']);
_paq.push(["setDomains", ["*.flink.apache.org","*.nightlies.apache.org/flink"]]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
</head>
<body dir=ZgotmplZ>
<header>
<nav class="navbar navbar-expand-xl">
<div class="container-fluid">
<a class="navbar-brand" href="/zh/">
<img src="/img/logo/png/100/flink_squirrel_100_color.png" alt="Apache Flink" height="47" width="47" class="d-inline-block align-text-middle">
<span>Apache Flink</span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<i class="fa fa-bars navbar-toggler-icon"></i>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">About</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="/zh/what-is-flink/flink-architecture/">架构</a>
</li>
<li>
<a class="dropdown-item" href="/zh/what-is-flink/flink-applications/">应用</a>
</li>
<li>
<a class="dropdown-item" href="/zh/what-is-flink/flink-operations/">运维</a>
</li>
<li>
<a class="dropdown-item" href="/zh/what-is-flink/use-cases/">应用场景</a>
</li>
<li>
<a class="dropdown-item" href="/zh/what-is-flink/powered-by/">Flink 用户</a>
</li>
<li>
<a class="dropdown-item" href="/zh/what-is-flink/roadmap/">开发计划</a>
</li>
<li>
<a class="dropdown-item" href="/zh/what-is-flink/community/">社区 & 项目信息</a>
</li>
<li>
<a class="dropdown-item" href="/zh/what-is-flink/security/">Security</a>
</li>
<li>
<a class="dropdown-item" href="/zh/what-is-flink/special-thanks/">特殊致谢</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">教程</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/docs/try-flink/local_installation/">With Flink<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/docs/try-flink-kubernetes-operator/quick-start/">With Flink Kubernetes Operator<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-stable/docs/get-started/introduction/">With Flink CDC<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-stable/docs/try-flink-ml/quick-start/">With Flink ML<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-stable/getting-started/project-setup.html">With Flink Stateful Functions<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/docs/learn-flink/overview/">Training Course<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Documentation</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/">Flink 1.19 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-master/">Flink Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/">Kubernetes Operator 1.8 (latest)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-main">Kubernetes Operator Main (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-stable">CDC 3.0 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-master">CDC Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-stable/">ML 2.3 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-master">ML Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-stable/">Stateful Functions 3.3 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-master">Stateful Functions Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">How to Contribute</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="/zh/how-to-contribute/overview/">如何参与贡献</a>
</li>
<li>
<a class="dropdown-item" href="/zh/how-to-contribute/contribute-code/">贡献代码</a>
</li>
<li>
<a class="dropdown-item" href="/zh/how-to-contribute/reviewing-prs/">审核 Pull Request</a>
</li>
<li>
<a class="dropdown-item" href="/zh/how-to-contribute/code-style-and-quality-preamble/">代码样式与质量指南</a>
</li>
<li>
<a class="dropdown-item" href="/zh/how-to-contribute/contribute-documentation/">贡献文档</a>
</li>
<li>
<a class="dropdown-item" href="/zh/how-to-contribute/documentation-style-guide/">文档样式指南</a>
</li>
<li>
<a class="dropdown-item" href="/zh/how-to-contribute/improve-website/">贡献网站</a>
</li>
<li>
<a class="dropdown-item" href="/zh/how-to-contribute/getting-help/">获取帮助</a>
</li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link" href="/zh/downloads/">Downloads</a>
</li>
</ul>
<div class="book-search">
<div class="book-search-spinner hidden">
<i class="fa fa-refresh fa-spin"></i>
</div>
<form class="search-bar d-flex" onsubmit="return false;"su>
<input type="text" id="book-search-input" placeholder="搜索" aria-label="搜索" maxlength="64" data-hotkeys="s/">
<i class="fa fa-search search"></i>
<i class="fa fa-circle-o-notch fa-spin spinner"></i>
</form>
<div class="book-search-spinner hidden"></div>
<ul id="book-search-results"></ul>
</div>
</div>
</div>
</nav>
<div class="navbar-clearfix"></div>
</header>
<main class="flex">
<section class="container book-page">
<article class="markdown"><h1 id="code-style-and-quality-guide--scala">
Code Style and Quality Guide — Scala
<a class="anchor" href="#code-style-and-quality-guide--scala">#</a>
</h1>
<h4 id="序言hahahugoshortcode68s0hbhb">
<a href="/zh/how-to-contribute/code-style-and-quality-preamble/">序言</a>
<a class="anchor" href="#%e5%ba%8f%e8%a8%80hahahugoshortcode68s0hbhb">#</a>
</h4>
<h4 id="pull-requests--changeshahahugoshortcode68s1hbhb">
<a href="/zh/how-to-contribute/code-style-and-quality-pull-requests/">Pull Requests &amp; Changes</a>
<a class="anchor" href="#pull-requests--changeshahahugoshortcode68s1hbhb">#</a>
</h4>
<h4 id="常用编码指南hahahugoshortcode68s2hbhb">
<a href="/zh/how-to-contribute/code-style-and-quality-common/">常用编码指南</a>
<a class="anchor" href="#%e5%b8%b8%e7%94%a8%e7%bc%96%e7%a0%81%e6%8c%87%e5%8d%97hahahugoshortcode68s2hbhb">#</a>
</h4>
<h4 id="java-语言指南hahahugoshortcode68s3hbhb">
<a href="/zh/how-to-contribute/code-style-and-quality-java/">Java 语言指南</a>
<a class="anchor" href="#java-%e8%af%ad%e8%a8%80%e6%8c%87%e5%8d%97hahahugoshortcode68s3hbhb">#</a>
</h4>
<h4 id="scala-语言指南hahahugoshortcode68s4hbhb">
<a href="/zh/how-to-contribute/code-style-and-quality-scala/">Scala 语言指南</a>
<a class="anchor" href="#scala-%e8%af%ad%e8%a8%80%e6%8c%87%e5%8d%97hahahugoshortcode68s4hbhb">#</a>
</h4>
<h4 id="组件指南hahahugoshortcode68s5hbhb">
<a href="/zh/how-to-contribute/code-style-and-quality-components/">组件指南</a>
<a class="anchor" href="#%e7%bb%84%e4%bb%b6%e6%8c%87%e5%8d%97hahahugoshortcode68s5hbhb">#</a>
</h4>
<h4 id="格式指南hahahugoshortcode68s6hbhb">
<a href="/zh/how-to-contribute/code-style-and-quality-formatting/">格式指南</a>
<a class="anchor" href="#%e6%a0%bc%e5%bc%8f%e6%8c%87%e5%8d%97hahahugoshortcode68s6hbhb">#</a>
</h4>
<h2 id="scala-语言特性">
Scala 语言特性
<a class="anchor" href="#scala-%e8%af%ad%e8%a8%80%e7%89%b9%e6%80%a7">#</a>
</h2>
<h3 id="在哪儿使用和不使用-scala">
在哪儿使用(和不使用) Scala
<a class="anchor" href="#%e5%9c%a8%e5%93%aa%e5%84%bf%e4%bd%bf%e7%94%a8%e5%92%8c%e4%b8%8d%e4%bd%bf%e7%94%a8-scala">#</a>
</h3>
<p><strong>对于 Scala 的 API 或者纯 Scala libraries,我们会选择使用 Scala。</strong></p>
<p><strong>在 core API 和 运行时的组件中,我们不使用 Scala。我们的目标是从这些组件中删除现有的 Scala 使用(代码和依赖项)。</strong></p>
<p>⇒ 这并不是因为我们不喜欢 Scala,而是考虑到“用正确的工具做正确的事”的结果(见下文)。</p>
<p>对于 API,我们使用 Java 开发基础内容,并在上层使用 Scala。</p>
<ul>
<li>这在传统上为 Java 和 Scala 提供了最佳的互通性</li>
<li>这意味着要致力于保持 Scala API 的更新</li>
</ul>
<p>为什么我们不在 Core API 和 Runtime 中使用 Scala ?</p>
<ul>
<li>过去的经验显示, Scala 在功能上的变化太快了。对于 Flink 社区来说,每次 Scala 版本升级都是一个比较棘手的处理过程。</li>
<li>Scala 并不总能很好地与 Java 的类交互,例如 Scala 的可见性范围的工作方式不同,而且常常向 Java 消费者公开的内容比预期的要多。</li>
<li>由于使用 Scala ,所以 Flink 的 artifact/dependency 管理增加了一层额外的复杂性。
* 我们希望通过接口抽象,同时也在运行时保留像 Akka 这样依赖 Scala 的库,然后将它们加载到单独的类加载器中,以保护它们并避免版本冲突。</li>
<li>Scala 让懂 Scala 的程序员很容易编写代码,而对于不太懂 Scala 的程序员来说,这些代码很难理解。对于一个拥有不同经验水平的广大社区的开源项目来说,这尤其棘手。解决这个问题意味着大量限制 Scala 特性集,这首先就违背了使用 Scala 的很多目的。</li>
</ul>
<h3 id="api-等价">
API 等价
<a class="anchor" href="#api-%e7%ad%89%e4%bb%b7">#</a>
</h3>
<p>保持 Java API 和 Scala API 在功能和代码质量方面的同步。</p>
<p>Scala API 也应该涵盖 Java API 的所有特性。</p>
<p>Scala API 应该有一个“完整性测试”,就如下面 DataStream API 的示例中的一样: <a href="https://github.com/apache/flink/blob/master/flink-streaming-scala/src/test/scala/org/apache/flink/streaming/api/scala/StreamingScalaAPICompletenessTest.scala">https://github.com/apache/flink/blob/master/flink-streaming-scala/src/test/scala/org/apache/flink/streaming/api/scala/StreamingScalaAPICompletenessTest.scala</a></p>
<h3 id="语言特性">
语言特性
<a class="anchor" href="#%e8%af%ad%e8%a8%80%e7%89%b9%e6%80%a7">#</a>
</h3>
<ul>
<li><strong>避免 Scala 隐式转换。</strong>
<ul>
<li>Scala 的隐式转换应该只用于面向用户的 API 改进,例如 Table API 表达式或类型信息提取。</li>
<li>不要把它们用于内部 “magic”。</li>
</ul>
</li>
<li><strong>为类成员添加显式类型。</strong>
<ul>
<li>
<p>对于类字段和方法返回类型,不要依赖隐式类型推断:</p>
<p><strong>不要这样:</strong></p>
<pre tabindex="0"><code>var expressions = new java.util.ArrayList[String]()
</code></pre><p><strong>要这样:</strong></p>
<pre tabindex="0"><code>var expressions: java.util.List[String] = new java.util.ArrayList[]()
</code></pre></li>
<li>
<p>堆栈上局部变量的类型推断是可以的。</p>
</li>
</ul>
</li>
<li><strong>用严格的可见性。</strong>
<ul>
<li>避免使用 Scala 的包私有特性(如 private[flink]),而是使用常规 private/protected 替代。</li>
<li>请注意:在 Java 中, <code>private[flink]</code><code>protected</code> 的成员是公开的。</li>
<li>请注意:在 Flink 提供的示例中, <code>private[flink]</code> 仍然会暴露所有成员。</li>
</ul>
</li>
</ul>
<h3 id="编码格式">
编码格式
<a class="anchor" href="#%e7%bc%96%e7%a0%81%e6%a0%bc%e5%bc%8f">#</a>
</h3>
<p><strong>使用换行来构造你的代码。</strong></p>
<ul>
<li>Scala 的函数性质允许长的转换链 (<code>x.map().map().foreach()</code>).</li>
<li>为了强制让实现者构造其代码,因此将行长度限制为 100 个字符以内。</li>
<li>为了更好的可维护性,每次转换使用一行。</li>
</ul>
</article>
<div class="edit-this-page">
<p>
<a href="https://cwiki.apache.org/confluence/display/FLINK/Flink+Translation+Specifications">Want to contribute translation?</a>
</p>
<p>
<a href="//github.com/apache/flink-web/edit/asf-site/docs/content.zh/how-to-contribute/code-style-and-quality-scala.md">
Edit This Page<i class="fa fa-edit fa-fw"></i>
</a>
</p>
</div>
</section>
<aside class="book-toc">
<nav id="TableOfContents"><h3>On This Page <a href="javascript:void(0)" class="toc" onclick="collapseToc()"><i class="fa fa-times" aria-hidden="true"></i></a></h3>
<ul>
<li><a href="#code-style-and-quality-guide--scala">Code Style and Quality Guide — Scala</a>
<ul>
<li>
<ul>
<li></li>
</ul>
</li>
<li><a href="#scala-语言特性">Scala 语言特性</a>
<ul>
<li><a href="#在哪儿使用和不使用-scala">在哪儿使用(和不使用) Scala</a></li>
<li><a href="#api-等价">API 等价</a></li>
<li><a href="#语言特性">语言特性</a></li>
<li><a href="#编码格式">编码格式</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</aside>
<aside class="expand-toc hidden">
<a class="toc" onclick="expandToc()" href="javascript:void(0)">
<i class="fa fa-bars" aria-hidden="true"></i>
</a>
</aside>
</main>
<footer>
<div class="separator"></div>
<div class="panels">
<div class="wrapper">
<div class="panel">
<ul>
<li>
<a href="https://flink-packages.org/">flink-packages.org</a>
</li>
<li>
<a href="https://www.apache.org/">Apache Software Foundation</a>
</li>
<li>
<a href="https://www.apache.org/licenses/">License</a>
</li>
<li>
<a href="/how-to-contribute/code-style-and-quality-scala/">
<i class="fa fa-globe" aria-hidden="true"></i>&nbsp;English
</a>
</li>
</ul>
</div>
<div class="panel">
<ul>
<li>
<a href="/zh/what-is-flink/security">Security</a-->
</li>
<li>
<a href="https://www.apache.org/foundation/sponsorship.html">Donate</a>
</li>
<li>
<a href="https://www.apache.org/foundation/thanks.html">Thanks</a>
</li>
</ul>
</div>
<div class="panel icons">
<div>
<a href="/posts">
<div class="icon flink-blog-icon"></div>
<span>Flink blog</span>
</a>
</div>
<div>
<a href="https://github.com/apache/flink">
<div class="icon flink-github-icon"></div>
<span>Github</span>
</a>
</div>
<div>
<a href="https://twitter.com/apacheflink">
<div class="icon flink-twitter-icon"></div>
<span>Twitter</span>
</a>
</div>
</div>
</div>
</div>
<hr/>
<div class="container disclaimer">
<p>The contents of this website are © 2024 Apache Software Foundation under the terms of the Apache License v2. Apache Flink, Flink, and the Flink logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.</p>
</div>
</footer>
</body>
</html>