Skip to content

Commit 6f8e0da

Browse files
brunoborgesCopilot
andcommitted
Add default interface methods snippet (#86)
New snippet covering Java 8 default methods on interfaces vs abstract classes for shared behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 1a6c6c5 commit 6f8e0da

File tree

4 files changed

+428
-5
lines changed

4 files changed

+428
-5
lines changed

aot-class-preloading.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484

8585
<div class="nav-arrows">
8686
<a href="/compact-object-headers.html" aria-label="Previous pattern"></a>
87-
87+
<a href="/default-interface-methods.html" aria-label="Next pattern"></a>
8888
</div>
8989
</div>
9090
</div>

data/snippets.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2888,5 +2888,39 @@
28882888
}
28892889
],
28902890
"support": "Available in JDK 25 LTS (JEPs 514/515, Sept 2025). Experimental."
2891+
},
2892+
{
2893+
"id": 86,
2894+
"slug": "default-interface-methods",
2895+
"title": "Default interface methods",
2896+
"category": "language",
2897+
"difficulty": "intermediate",
2898+
"jdkVersion": "8",
2899+
"oldLabel": "Java 7",
2900+
"modernLabel": "Java 8+",
2901+
"oldApproach": "Abstract classes for shared behavior",
2902+
"modernApproach": "Default methods on interfaces",
2903+
"oldCode": "// Need abstract class to share behavior\npublic abstract class AbstractLogger {\n public void log(String msg) {\n System.out.println(\n timestamp() + \": \" + msg);\n }\n abstract String timestamp();\n}\n\n// Single inheritance only\npublic class FileLogger\n extends AbstractLogger { ... }",
2904+
"modernCode": "public interface Logger {\n default void log(String msg) {\n System.out.println(\n timestamp() + \": \" + msg);\n }\n String timestamp();\n}\n\n// Multiple interfaces allowed\npublic class FileLogger\n implements Logger, Closeable { ... }",
2905+
"summary": "Add method implementations directly in interfaces, enabling multiple inheritance of behavior.",
2906+
"explanation": "Before Java 8, sharing behavior across unrelated classes required abstract classes, which limited you to single inheritance. Default methods let interfaces provide method implementations, so classes can inherit behavior from multiple interfaces. This was essential for evolving the Collections API (e.g., List.forEach, Map.getOrDefault) without breaking existing implementations.",
2907+
"whyModernWins": [
2908+
{
2909+
"icon": "\ud83d\udd00",
2910+
"title": "Multiple inheritance",
2911+
"desc": "Classes can implement many interfaces with default methods, unlike single abstract class inheritance."
2912+
},
2913+
{
2914+
"icon": "\ud83d\udce6",
2915+
"title": "API evolution",
2916+
"desc": "Add new methods to interfaces without breaking existing implementations."
2917+
},
2918+
{
2919+
"icon": "\ud83e\udde9",
2920+
"title": "Composable behavior",
2921+
"desc": "Mix and match capabilities from multiple interfaces freely."
2922+
}
2923+
],
2924+
"support": "Available since JDK 8 (March 2014)."
28912925
}
28922926
]

default-interface-methods.html

Lines changed: 344 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,344 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>Default interface methods | java.evolved</title>
7+
<meta name="description" content="Add method implementations directly in interfaces, enabling multiple inheritance of behavior.">
8+
<meta name="robots" content="index, follow">
9+
<link rel="canonical" href="https://javaevolved.github.io/default-interface-methods.html">
10+
<link rel="stylesheet" href="styles.css">
11+
<link rel="icon" href="favicon.svg" type="image/svg+xml">
12+
<link rel="manifest" href="manifest.json">
13+
<meta name="theme-color" content="#f97316">
14+
<meta name="mobile-web-app-capable" content="yes">
15+
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
16+
<meta name="apple-mobile-web-app-title" content="java.evolved">
17+
18+
<meta property="og:title" content="Default interface methods | java.evolved">
19+
<meta property="og:description" content="Add method implementations directly in interfaces, enabling multiple inheritance of behavior.">
20+
<meta property="og:url" content="https://javaevolved.github.io/default-interface-methods.html">
21+
<meta property="og:type" content="article">
22+
<meta property="og:site_name" content="java.evolved">
23+
<meta property="og:locale" content="en_US">
24+
<meta property="og:image" content="https://javaevolved.github.io/images/social-card.png">
25+
<meta property="og:image:width" content="1200">
26+
<meta property="og:image:height" content="630">
27+
<meta property="og:image:type" content="image/png">
28+
29+
<meta name="twitter:card" content="summary_large_image">
30+
<meta name="twitter:title" content="Default interface methods | java.evolved">
31+
<meta name="twitter:description" content="Add method implementations directly in interfaces, enabling multiple inheritance of behavior.">
32+
<meta name="twitter:image" content="https://javaevolved.github.io/images/social-card.png">
33+
34+
<script type="application/ld+json">
35+
{
36+
"@context": "https://schema.org",
37+
"@type": "TechArticle",
38+
"headline": "Default interface methods",
39+
"description": "Add method implementations directly in interfaces, enabling multiple inheritance of behavior.",
40+
"url": "https://javaevolved.github.io/default-interface-methods.html",
41+
"publisher": {
42+
"@type": "Organization",
43+
"name": "java.evolved",
44+
"url": "https://javaevolved.github.io"
45+
},
46+
"mainEntityOfPage": {
47+
"@type": "WebPage",
48+
"@id": "https://javaevolved.github.io/default-interface-methods.html"
49+
}
50+
}
51+
</script>
52+
<script type="application/ld+json">
53+
{
54+
"@context": "https://schema.org",
55+
"@type": "BreadcrumbList",
56+
"itemListElement": [
57+
{
58+
"@type": "ListItem",
59+
"position": 1,
60+
"name": "Home",
61+
"item": "https://javaevolved.github.io/"
62+
},
63+
{
64+
"@type": "ListItem",
65+
"position": 2,
66+
"name": "Language",
67+
"item": "https://javaevolved.github.io/?cat=language"
68+
},
69+
{
70+
"@type": "ListItem",
71+
"position": 3,
72+
"name": "Default interface methods"
73+
}
74+
]
75+
}
76+
</script>
77+
</head>
78+
<body data-page="single">
79+
<nav>
80+
<div class="nav-inner">
81+
<a href="/" class="logo">java.<span>evolved</span></a>
82+
<div class="nav-right">
83+
<a href="/" class="back-link">← All patterns</a>
84+
85+
<div class="nav-arrows">
86+
<a href="/aot-class-preloading.html" aria-label="Previous pattern"></a>
87+
88+
</div>
89+
</div>
90+
</div>
91+
</nav>
92+
93+
<article class="article">
94+
<div class="breadcrumb">
95+
<a href="/">Home</a>
96+
<span class="sep">/</span>
97+
<a href="/?cat=language">Language</a>
98+
<span class="sep">/</span>
99+
<span>Default interface methods</span>
100+
</div>
101+
102+
<div class="tip-header">
103+
<div class="tip-meta">
104+
<span class="badge language">Language</span>
105+
<span class="badge intermediate">intermediate</span>
106+
</div>
107+
<h1>Default interface methods</h1>
108+
<p>Add method implementations directly in interfaces, enabling multiple inheritance of behavior.</p>
109+
</div>
110+
111+
<section class="compare-section">
112+
<div class="section-label">Code Comparison</div>
113+
<div class="compare-container">
114+
<div class="compare-panel old-panel">
115+
<div class="compare-panel-header">
116+
<span class="compare-tag old">✕ Java 7</span>
117+
<button class="copy-btn" data-code="old">Copy</button>
118+
</div>
119+
<div class="compare-code">
120+
<pre class="code-text">// Need abstract class to share behavior
121+
public abstract class AbstractLogger {
122+
public void log(String msg) {
123+
System.out.println(
124+
timestamp() + &quot;: &quot; + msg);
125+
}
126+
abstract String timestamp();
127+
}
128+
129+
// Single inheritance only
130+
public class FileLogger
131+
extends AbstractLogger { ... }</pre>
132+
</div>
133+
</div>
134+
<div class="compare-panel modern-panel">
135+
<div class="compare-panel-header">
136+
<span class="compare-tag modern">✓ Java 8+</span>
137+
<button class="copy-btn" data-code="modern">Copy</button>
138+
</div>
139+
<div class="compare-code">
140+
<pre class="code-text">public interface Logger {
141+
default void log(String msg) {
142+
System.out.println(
143+
timestamp() + &quot;: &quot; + msg);
144+
}
145+
String timestamp();
146+
}
147+
148+
// Multiple interfaces allowed
149+
public class FileLogger
150+
implements Logger, Closeable { ... }</pre>
151+
</div>
152+
</div>
153+
</div>
154+
</section>
155+
156+
<section class="why-section">
157+
<div class="section-label">Why the modern way wins</div>
158+
<div class="why-grid">
159+
<div class="why-card">
160+
<div class="why-icon">🔀</div>
161+
<h3>Multiple inheritance</h3>
162+
<p>Classes can implement many interfaces with default methods, unlike single abstract class inheritance.</p>
163+
</div>
164+
<div class="why-card">
165+
<div class="why-icon">📦</div>
166+
<h3>API evolution</h3>
167+
<p>Add new methods to interfaces without breaking existing implementations.</p>
168+
</div>
169+
<div class="why-card">
170+
<div class="why-icon">🧩</div>
171+
<h3>Composable behavior</h3>
172+
<p>Mix and match capabilities from multiple interfaces freely.</p>
173+
</div>
174+
</div>
175+
</section>
176+
177+
<div class="info-grid">
178+
<div class="info-card">
179+
<div class="info-label">Old Approach</div>
180+
<div class="info-value red">Abstract classes for shared behavior</div>
181+
</div>
182+
<div class="info-card">
183+
<div class="info-label">Modern Approach</div>
184+
<div class="info-value green">Default methods on interfaces</div>
185+
</div>
186+
<div class="info-card">
187+
<div class="info-label">Since JDK</div>
188+
<div class="info-value accent">8</div>
189+
</div>
190+
<div class="info-card">
191+
<div class="info-label">Difficulty</div>
192+
<div class="info-value blue">intermediate</div>
193+
</div>
194+
</div>
195+
196+
<section class="bs-section">
197+
<div class="section-label">JDK Support</div>
198+
<div class="bs-card">
199+
<div class="bs-feature-name">Default interface methods</div>
200+
<span class="baseline-badge widely">Available</span>
201+
<p class="bs-desc">Available since JDK 8 (March 2014).</p>
202+
</div>
203+
</section>
204+
205+
<section class="explanation">
206+
<h2>How it works</h2>
207+
<p>Before Java 8, sharing behavior across unrelated classes required abstract classes, which limited you to single inheritance. Default methods let interfaces provide method implementations, so classes can inherit behavior from multiple interfaces. This was essential for evolving the Collections API (e.g., List.forEach, Map.getOrDefault) without breaking existing implementations.</p>
208+
</section>
209+
210+
<section class="related">
211+
<h2>Related patterns</h2>
212+
<div class="related-grid">
213+
<a href="/private-interface-methods.html" class="tip-card">
214+
<div class="tip-card-body">
215+
<div class="tip-card-header">
216+
<div class="tip-badges">
217+
<span class="badge language">Language</span>
218+
<span class="badge intermediate">intermediate</span>
219+
</div>
220+
</div>
221+
<h3>Private interface methods</h3>
222+
</div>
223+
<div class="card-code">
224+
<div class="card-code-layer old-layer">
225+
<div class="mini-label">Java 8</div>
226+
<pre class="code-text">interface Logger {
227+
default void logInfo(String msg) {
228+
System.out.println(
229+
&quot;[INFO] &quot; + timestamp() + msg);
230+
}
231+
default void logWarn(String msg) {
232+
System.out.println(
233+
&quot;[WARN] &quot; + timestamp() + msg);
234+
}
235+
}</pre>
236+
</div>
237+
<div class="card-code-layer modern-layer">
238+
<div class="mini-label">Java 9+</div>
239+
<pre class="code-text">interface Logger {
240+
private String format(String lvl, String msg) {
241+
return &quot;[&quot; + lvl + &quot;] &quot; + timestamp() + msg;
242+
}
243+
default void logInfo(String msg) {
244+
System.out.println(format(&quot;INFO&quot;, msg));
245+
}
246+
default void logWarn(String msg) {
247+
System.out.println(format(&quot;WARN&quot;, msg));
248+
}
249+
}</pre>
250+
</div>
251+
<span class="hover-hint">Hover to see modern ➜</span>
252+
</div>
253+
<div class="tip-card-footer">
254+
<span class="browser-support"><span class="dot"></span>JDK 9+</span>
255+
<span class="arrow-link"></span>
256+
</div>
257+
</a>
258+
<a href="/pattern-matching-instanceof.html" class="tip-card">
259+
<div class="tip-card-body">
260+
<div class="tip-card-header">
261+
<div class="tip-badges">
262+
<span class="badge language">Language</span>
263+
<span class="badge beginner">beginner</span>
264+
</div>
265+
</div>
266+
<h3>Pattern matching for instanceof</h3>
267+
</div>
268+
<div class="card-code">
269+
<div class="card-code-layer old-layer">
270+
<div class="mini-label">Java 8</div>
271+
<pre class="code-text">if (obj instanceof String) {
272+
String s = (String) obj;
273+
System.out.println(s.length());
274+
}</pre>
275+
</div>
276+
<div class="card-code-layer modern-layer">
277+
<div class="mini-label">Java 16+</div>
278+
<pre class="code-text">if (obj instanceof String s) {
279+
System.out.println(s.length());
280+
}</pre>
281+
</div>
282+
<span class="hover-hint">Hover to see modern ➜</span>
283+
</div>
284+
<div class="tip-card-footer">
285+
<span class="browser-support"><span class="dot"></span>JDK 16+</span>
286+
<span class="arrow-link"></span>
287+
</div>
288+
</a>
289+
<a href="/sealed-classes.html" class="tip-card">
290+
<div class="tip-card-body">
291+
<div class="tip-card-header">
292+
<div class="tip-badges">
293+
<span class="badge language">Language</span>
294+
<span class="badge intermediate">intermediate</span>
295+
</div>
296+
</div>
297+
<h3>Sealed classes for type hierarchies</h3>
298+
</div>
299+
<div class="card-code">
300+
<div class="card-code-layer old-layer">
301+
<div class="mini-label">Java 8</div>
302+
<pre class="code-text">// Anyone can extend Shape
303+
public abstract class Shape { }
304+
public class Circle extends Shape { }
305+
public class Rect extends Shape { }
306+
// unknown subclasses possible</pre>
307+
</div>
308+
<div class="card-code-layer modern-layer">
309+
<div class="mini-label">Java 17+</div>
310+
<pre class="code-text">public sealed interface Shape
311+
permits Circle, Rect {}
312+
public record Circle(double r)
313+
implements Shape {}
314+
public record Rect(double w, double h)
315+
implements Shape {}</pre>
316+
</div>
317+
<span class="hover-hint">Hover to see modern ➜</span>
318+
</div>
319+
<div class="tip-card-footer">
320+
<span class="browser-support"><span class="dot"></span>JDK 17+</span>
321+
<span class="arrow-link"></span>
322+
</div>
323+
</a>
324+
</div>
325+
</section>
326+
</article>
327+
</section>
328+
329+
330+
<div class="social-share">
331+
<span class="share-label">Share</span>
332+
<a href="https://x.com/intent/tweet?url=https%3A%2F%2Fjavaevolved.github.io%2Fdefault-interface-methods.html&text=Default%20interface%20methods%20%E2%80%93%20java.evolved" target="_blank" rel="noopener" class="share-btn share-x" aria-label="Share on X">𝕏</a>
333+
<a href="https://bsky.app/intent/compose?text=Default%20interface%20methods%20%E2%80%93%20java.evolved%20https%3A%2F%2Fjavaevolved.github.io%2Fdefault-interface-methods.html" target="_blank" rel="noopener" class="share-btn share-bsky" aria-label="Share on Bluesky">🦋</a>
334+
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fjavaevolved.github.io%2Fdefault-interface-methods.html" target="_blank" rel="noopener" class="share-btn share-li" aria-label="Share on LinkedIn">in</a>
335+
<a href="https://www.reddit.com/submit?url=https%3A%2F%2Fjavaevolved.github.io%2Fdefault-interface-methods.html&title=Default%20interface%20methods%20%E2%80%93%20java.evolved" target="_blank" rel="noopener" class="share-btn share-reddit" aria-label="Share on Reddit"></a>
336+
</div>
337+
338+
<footer>
339+
<p>A project by <a href="https://github.com/brunoborges" target="_blank" rel="noopener">Bruno Borges</a></p>
340+
</footer>
341+
342+
<script src="app.js"></script>
343+
</body>
344+
</html>

0 commit comments

Comments
 (0)