<!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
  <meta charset="UTF-8">
  <title>Coding Guidelines</title>
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <meta name="generator" content="Jekyll v2.4.0">
  <link rel="stylesheet" href="/css/font-awesome.min.css">
  <link rel="stylesheet" href="/css/screen.css">
  <link rel="icon" type="image/x-icon" href="/favicon.ico">
  <script src="/js/jquery-3.2.1.min.js"></script>
  <!--[if lt IE 9]>
  <script src="/js/html5shiv.min.js"></script>
  <script src="/js/respond.min.js"></script>
  <![endif]-->
  <script src="/js/screen.js"></script>
  <script type="text/javascript" src="/assets/javascripts/bundle.js" charset="utf-8"></script>
</head>


<body>
  <header role="banner">
  <nav class="mobile-nav show-on-mobiles">
    <ul>
  <li class="">
    <a href="/">Home</a>
  </li>
  <li class="">
    <a href="/docs/">Doc<span class="show-on-mobiles">s</span><span class="hide-on-mobiles">umentation</span></a>
  </li>
  </li>
  <li class="">
    <a href="/downloads/">Downloads</a>
  </li>
  <li class="">
    <a href="/talks/">Talks</a>
  </li>
  <li class="">
    <a href="/news/">News</a>
  </li>
  <li class="current">
    <a href="/develop/">Develop</a>
  </li>
  <li class="">
    <a href="/help/">Help</a>
  </li>
</ul>

  </nav>
  <div class="grid">
    <div class="unit one-third center-on-mobiles">
      <h1>
        <a href="/">
          <span class="sr-only">Apache Mnemonic</span>
          <img src="/img/mnemonic_logo_v2.png" width="289" alt="Mnemonic Logo" class="logo">
        </a>
        <a  href="https://www.apache.org/events/current-event.html">
          <img src="https://www.apache.org/events/current-event-234x60.png"/>
        </a>
      </h1>
    </div>
    <nav class="main-nav unit two-thirds hide-on-mobiles">
      <ul>
  <li class="">
    <a href="/">Home</a>
  </li>
  <li class="">
    <a href="/docs/">Doc<span class="show-on-mobiles">s</span><span class="hide-on-mobiles">umentation</span></a>
  </li>
  </li>
  <li class="">
    <a href="/downloads/">Downloads</a>
  </li>
  <li class="">
    <a href="/talks/">Talks</a>
  </li>
  <li class="">
    <a href="/news/">News</a>
  </li>
  <li class="current">
    <a href="/develop/">Develop</a>
  </li>
  <li class="">
    <a href="/help/">Help</a>
  </li>
</ul>

    </nav>
  </div>
  <!-- Return to Top -->
  <a href="#top" id="return-to-top"><i class="fa fa-chevron-up"></i></a>
</header>


  <section class="standalone">
  <div class="grid">

    <div class="unit whole">
      <article>
        <h1>Coding Guidelines</h1>
        <h2 id="general-rules">General rules</h2>

<ul>
  <li>All files must have an Apache copyright header at the top of the file.</li>
  <li>Code should be removed rather than commented out.</li>
  <li>All public functions should have javadoc comments.</li>
  <li>Always use braces to surround branches.</li>
  <li>try-finally should be avoided.</li>
</ul>

<h2 id="formatting">Formatting</h2>

<ul>
  <li>All files must have an 80 character maximum line length.</li>
  <li>Indentation should be 2 spaces.</li>
  <li>Files should use spaces instead of tabs.</li>
  <li>Wrapping lines
    <ul>
      <li>Break after a comma.</li>
      <li>Break before an operator.</li>
      <li>Prefer higher-level breaks to lower-level breaks.</li>
      <li>Align the new line with beginning of the expression at the same level
on the previous line.</li>
      <li>If the above rules lead to confusing code, just indent 8 spaces.</li>
    </ul>
  </li>
  <li>One variable declaration per a line.</li>
</ul>

<h2 id="naming">Naming</h2>

<ul>
  <li>Packages should be all lowercase.
    <ul>
      <li>Java code should be in <code>org.apache.mnemonic</code>, except for compatibility classes</li>
    </ul>
  </li>
  <li>Classes should be in mixed case.</li>
  <li>Variables should be in camel case.</li>
  <li>Constants should be in upper case.</li>
</ul>

      </article>
    </div>

    <div class="clear"></div>

  </div>
</section>


  <footer role="contentinfo">
    <p><div align="center">Apache Mnemonic, Mnemonic, Apache, and the Mnemonic logo are trademarks of The Apache Software Foundation.</div>
<div align="center"> Copyright &copy;&nbsp;2021 <a href="https://www.apache.org/">The Apache Software Foundation</a></div></p>
</footer>

  <script>
  var anchorForId = function (id) {
    var anchor = document.createElement("a");
    anchor.className = "header-link";
    anchor.href      = "#" + id;
    anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>";
    anchor.title = "Permalink";
    return anchor;
  };

  var linkifyAnchors = function (level, containingElement) {
    var headers = containingElement.getElementsByTagName("h" + level);
    for (var h = 0; h < headers.length; h++) {
      var header = headers[h];

      if (typeof header.id !== "undefined" && header.id !== "") {
        header.appendChild(anchorForId(header.id));
      }
    }
  };

  document.onreadystatechange = function () {
    if (this.readyState === "complete") {
      var contentBlock = document.getElementsByClassName("docs")[0] || document.getElementsByClassName("news")[0];
      if (!contentBlock) {
        return;
      }
      for (var level = 1; level <= 6; level++) {
        linkifyAnchors(level, contentBlock);
      }
    }
  };
</script>


</body>
</html>
