<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>設計原則 on [Lou's lab]</title><link>/tags/%E8%A8%AD%E8%A8%88%E5%8E%9F%E5%89%87/</link><description>Recent content in 設計原則 on [Lou's lab]</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><copyright>Copyright ©2020 Lou</copyright><lastBuildDate>Sun, 22 Jun 2025 22:30:00 +0800</lastBuildDate><atom:link href="/tags/%E8%A8%AD%E8%A8%88%E5%8E%9F%E5%89%87/index.xml" rel="self" type="application/rss+xml"/><item><title>Effective Java Item25：將原始碼檔案限制為單一top-level的類別</title><link>/posts/book/effective-java-item25/</link><pubDate>Sun, 22 Jun 2025 22:30:00 +0800</pubDate><guid>/posts/book/effective-java-item25/</guid><description>&lt;p>整理 &lt;strong>Effective Java&lt;/strong> 書中 Item 25：Limit source files to a single top-level class 心得筆記&lt;/p>
&lt;h2 id="主旨保持一檔一類別避免隱藏的地雷">主旨：保持一檔一類別，避免隱藏的地雷&lt;/h2>
&lt;p>Java 技術上允許你在一個 &lt;code>.java&lt;/code> 檔案中定義多個 top-level 類別（也就是非巢狀的 public 或 package-private 類別），但這麼做其實是一個&lt;strong>踩雷設計&lt;/strong>。這會讓你的程式行為變得難以預測，尤其當你在不同檔案中定義了相同名稱的類別，編譯結果會依照檔案的編譯順序而不同，產生極大的風險。&lt;/p></description></item><item><title>Effective Java Item24：比起非靜態成員類型，更偏好靜態成員類型</title><link>/posts/book/effective-java-item24/</link><pubDate>Sat, 21 Jun 2025 22:30:00 +0800</pubDate><guid>/posts/book/effective-java-item24/</guid><description>&lt;p>整理 &lt;strong>Effective Java&lt;/strong> 書中 Item 24: Prefer static member classes to non-static member classes 心得筆記&lt;/p>
&lt;h2 id="主旨">主旨&lt;/h2>
&lt;p>在 Java 中，巢狀類別（Nested Class）是一種將類別定義在另一個類別內部的設計方式。根據是否需要外部類別的實例，有四種巢狀類別：&lt;code>static member class&lt;/code>、&lt;code>non-static member class&lt;/code>、&lt;code>local class&lt;/code> 和 &lt;code>anonymous class&lt;/code>。本篇聚焦在：&lt;strong>當巢狀類別不需要外部類別實例時，應優先使用 static member class&lt;/strong>，這樣可以節省記憶體、提升效能、避免記憶體洩漏，也對設計更有彈性。&lt;/p></description></item><item><title>Effective Java Item23：偏好使用類別階層而非標籤類別</title><link>/posts/book/effective-java-item23/</link><pubDate>Fri, 20 Jun 2025 22:30:00 +0800</pubDate><guid>/posts/book/effective-java-item23/</guid><description>&lt;p>整理 &lt;strong>Effective Java&lt;/strong> 書中 Item 23: Prefer class hierarchies to tagged classes 心得筆記&lt;/p>
&lt;h2 id="主旨">主旨&lt;/h2>
&lt;p>在寫Java時，有時我們會想設計一個類別，可以代表「好幾種不同型態的物件」。這時，有些人會選擇用一個「tag 欄位」來做判斷，稱為 &lt;em>tagged class&lt;/em>。但這樣的寫法其實有很多問題，本條目會說明為什麼應該用「類別階層」來取代「tagged class」。&lt;/p>
&lt;h2 id="什麼是-tagged-class">什麼是 Tagged Class？&lt;/h2>
&lt;p>來看一個實際範例：&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#75715e">// 不推薦的 tagged class 寫法
&lt;/span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Notification&lt;/span> &lt;span style="color:#f92672">{&lt;/span>
&lt;span style="color:#66d9ef">enum&lt;/span> Type &lt;span style="color:#f92672">{&lt;/span> EMAIL&lt;span style="color:#f92672">,&lt;/span> SMS &lt;span style="color:#f92672">}&lt;/span>
&lt;span style="color:#66d9ef">final&lt;/span> Type type&lt;span style="color:#f92672">;&lt;/span>
String emailAddress&lt;span style="color:#f92672">;&lt;/span>
String phoneNumber&lt;span style="color:#f92672">;&lt;/span>
String message&lt;span style="color:#f92672">;&lt;/span>
Notification&lt;span style="color:#f92672">(&lt;/span>String emailAddress&lt;span style="color:#f92672">,&lt;/span> String message&lt;span style="color:#f92672">)&lt;/span> &lt;span style="color:#f92672">{&lt;/span>
&lt;span style="color:#66d9ef">this&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">type&lt;/span> &lt;span style="color:#f92672">=&lt;/span> Type&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">EMAIL&lt;/span>&lt;span style="color:#f92672">;&lt;/span>
&lt;span style="color:#66d9ef">this&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">emailAddress&lt;/span> &lt;span style="color:#f92672">=&lt;/span> emailAddress&lt;span style="color:#f92672">;&lt;/span>
&lt;span style="color:#66d9ef">this&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">message&lt;/span> &lt;span style="color:#f92672">=&lt;/span> message&lt;span style="color:#f92672">;&lt;/span>
&lt;span style="color:#f92672">}&lt;/span>
Notification&lt;span style="color:#f92672">(&lt;/span>String phoneNumber&lt;span style="color:#f92672">,&lt;/span> String message&lt;span style="color:#f92672">,&lt;/span> &lt;span style="color:#66d9ef">boolean&lt;/span> isSMS&lt;span style="color:#f92672">)&lt;/span> &lt;span style="color:#f92672">{&lt;/span>
&lt;span style="color:#66d9ef">this&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">type&lt;/span> &lt;span style="color:#f92672">=&lt;/span> Type&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">SMS&lt;/span>&lt;span style="color:#f92672">;&lt;/span>
&lt;span style="color:#66d9ef">this&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">phoneNumber&lt;/span> &lt;span style="color:#f92672">=&lt;/span> phoneNumber&lt;span style="color:#f92672">;&lt;/span>
&lt;span style="color:#66d9ef">this&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">message&lt;/span> &lt;span style="color:#f92672">=&lt;/span> message&lt;span style="color:#f92672">;&lt;/span>
&lt;span style="color:#f92672">}&lt;/span>
&lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">send&lt;/span>&lt;span style="color:#f92672">()&lt;/span> &lt;span style="color:#f92672">{&lt;/span>
&lt;span style="color:#66d9ef">switch&lt;/span> &lt;span style="color:#f92672">(&lt;/span>type&lt;span style="color:#f92672">)&lt;/span> &lt;span style="color:#f92672">{&lt;/span>
&lt;span style="color:#66d9ef">case&lt;/span> EMAIL&lt;span style="color:#f92672">:&lt;/span>
System&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">out&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">println&lt;/span>&lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Sending EMAIL to &amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> emailAddress &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;: &amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> message&lt;span style="color:#f92672">);&lt;/span>
&lt;span style="color:#66d9ef">break&lt;/span>&lt;span style="color:#f92672">;&lt;/span>
&lt;span style="color:#66d9ef">case&lt;/span> SMS&lt;span style="color:#f92672">:&lt;/span>
System&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">out&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#a6e22e">println&lt;/span>&lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Sending SMS to &amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> phoneNumber &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;: &amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> message&lt;span style="color:#f92672">);&lt;/span>
&lt;span style="color:#66d9ef">break&lt;/span>&lt;span style="color:#f92672">;&lt;/span>
&lt;span style="color:#f92672">}&lt;/span>
&lt;span style="color:#f92672">}&lt;/span>
&lt;span style="color:#f92672">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Effective Java Item17 最小化可變性</title><link>/posts/book/effective-java-item17/</link><pubDate>Sat, 14 Jun 2025 11:30:00 +0800</pubDate><guid>/posts/book/effective-java-item17/</guid><description>&lt;p>整理 &lt;strong>Effective Java&lt;/strong> 書中 Item 17: Minimize mutability 心得筆記&lt;/p>
&lt;h2 id="主旨">主旨&lt;/h2>
&lt;p>當你設計類別時，預設應該先問自己：這個物件&lt;strong>真的需要改變狀態嗎&lt;/strong>？如果不需要，請讓它&lt;strong>不可變（Immutable）&lt;/strong>。不可變類別更安全、更好測試、也更容易被重用與快取。&lt;/p></description></item></channel></rss>