<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archiwa multiple implementation | To co najważniejsze</title>
	<atom:link href="https://www.danuta-cybulska.com/tag/multiple-implementation/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.danuta-cybulska.com/tag/multiple-implementation/</link>
	<description>Blog o wszystkim tym co jest dla mnie najważniejsze w życiu.</description>
	<lastBuildDate>Mon, 02 Feb 2026 10:53:24 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://www.danuta-cybulska.com/wp-content/uploads/2025/06/3-150x150.png</url>
	<title>Archiwa multiple implementation | To co najważniejsze</title>
	<link>https://www.danuta-cybulska.com/tag/multiple-implementation/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Learning Log #3: Tydzień 12 Zajavka &#8211; interfejsy, klasy abstrakcyjne i koniec podstaw Java</title>
		<link>https://www.danuta-cybulska.com/learning-log-3-interfejsy-java-zajavka-koniec-podstaw/</link>
					<comments>https://www.danuta-cybulska.com/learning-log-3-interfejsy-java-zajavka-koniec-podstaw/#respond</comments>
		
		<dc:creator><![CDATA[Danuta]]></dc:creator>
		<pubDate>Wed, 18 Mar 2026 17:00:00 +0000</pubDate>
				<category><![CDATA[LearningLog]]></category>
		<category><![CDATA[Programowanie i Rozwój]]></category>
		<category><![CDATA[co dalej]]></category>
		<category><![CDATA[functional interface]]></category>
		<category><![CDATA[interfejsy Java]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[klasy abstrakcyjne Java]]></category>
		<category><![CDATA[koniec kursu]]></category>
		<category><![CDATA[learning log]]></category>
		<category><![CDATA[mama programuje]]></category>
		<category><![CDATA[multiple implementation]]></category>
		<category><![CDATA[nauka programowania]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Zajavka]]></category>
		<guid isPermaLink="false">https://www.danuta-cybulska.com/?p=5770</guid>

					<description><![CDATA[<p>Siedemnasty tydzień od startu z kursem Zajavka. Oficjalnie tydzień 12 &#8211; ostatni tydzień podstawowej części kursu. Kawa się parowała. Słuchawki na uszach. Dziecko spokojne. I ja, patrząc na ekran z napisem &#8222;Gratulacje! Udało Ci się ukończyć kurs podstawowy!&#8221; czułam&#8230; ulgę. I dumę. I lekki strach &#8222;co dalej?&#8221;. Interfejsy w Java brzmiały dla mnie przez długi...</p>
<p>Artykuł <a href="https://www.danuta-cybulska.com/learning-log-3-interfejsy-java-zajavka-koniec-podstaw/">Learning Log #3: Tydzień 12 Zajavka &#8211; interfejsy, klasy abstrakcyjne i koniec podstaw Java</a> pochodzi z serwisu <a href="https://www.danuta-cybulska.com">To co najważniejsze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cover is-light"><span aria-hidden="true" class="wp-block-cover__background has-background-dim" style="background-color:#9c8d60"></span><img fetchpriority="high" decoding="async" width="2560" height="1708" src="https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-scaled.jpg" class="wp-block-cover__image-background wp-post-image" alt="interfejsy Java." data-object-fit="cover" data-object-position="51% 36%" style="object-position:51% 36%;" srcset="https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-scaled.jpg 2560w, https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-300x200.jpg 300w, https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-1024x683.jpg 1024w, https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-767x512.jpg 767w, https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-1536x1025.jpg 1536w, https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-2048x1366.jpg 2048w, https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-scaled-340x226.jpg 340w, https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-scaled-1696x1132.jpg 1696w, https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-scaled-848x566.jpg 848w, https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-scaled-740x494.jpg 740w, https://www.danuta-cybulska.com/wp-content/uploads/2026/02/a-minimalist-desktop-setup-featuring-a-laptop-keyboard-and-a-small-green-plant-on-a-vibrant-background.-16770262-scaled-370x247.jpg 370w" sizes="(max-width: 2560px) 100vw, 2560px" /><div class="wp-block-cover__inner-container is-layout-constrained wp-block-cover-is-layout-constrained"><h2 style="background-color:#abb7c26e" class="has-text-align-center has-link-color wp-elements-1 wp-block-post-title has-text-color has-white-color has-background has-x-large-font-size">Learning Log #3: Tydzień 12 Zajavka &#8211; interfejsy, klasy abstrakcyjne i koniec podstaw Java</h2></div></div>



<p class="wp-block-paragraph">Siedemnasty tydzień od startu z kursem Zajavka. Oficjalnie tydzień 12 &#8211; ostatni tydzień podstawowej części kursu.</p>



<p class="wp-block-paragraph">Kawa się parowała. Słuchawki na uszach. Dziecko spokojne. I ja, patrząc na ekran z napisem &#8222;Gratulacje! Udało Ci się ukończyć kurs podstawowy!&#8221; czułam&#8230; ulgę. I dumę. I lekki strach &#8222;co dalej?&#8221;.</p>



<p class="wp-block-paragraph"><strong>Interfejsy w Java</strong> brzmiały dla mnie przez długi czas jak jakaś magiczna zaawansowana rzecz. Dziś wiem, że to jeden z najpotężniejszych narzędzi w OOP. I pokażę Wam dlaczego.</p>



<h2 class="wp-block-heading">Gdzie jestem w kursie Java?</h2>



<p class="wp-block-paragraph"><strong>Oficjalnie:</strong> Tydzień 12/12 kursu &#8222;Java w 12 tygodni Zajavka&#8221; &#8211; koniec podstaw ✓</p>



<p class="wp-block-paragraph"><strong>Realnie:</strong> 17 tygodni od startu (czyli ~4 miesiące kalendarzowe)</p>



<p class="wp-block-paragraph"><strong>Co dalej:</strong> Zajavka ma część zaawansowaną &#8211; Spring, bazy danych, REST API. Decyduję czy kontynuować czy przejść na JavaScript.</p>



<p class="wp-block-paragraph"><strong>Czas nauki w tym tygodniu:</strong> 10 godzin (wracam do formy!)</p>



<h2 class="wp-block-heading">Czym są interfejsy w Java? (w końcu rozumiem!)</h2>



<h3 class="wp-block-heading">Analogia która mi pomogła &#8211; umowa o pracę:</h3>



<p class="wp-block-paragraph">Wyobraź sobie że zatrudniasz pracownika. Nie obchodzi Cię:</p>



<ul class="wp-block-list">
<li>Jak dokładnie wykonuje pracę</li>



<li>Jakie narzędzia używa</li>



<li>Jaki ma proces myślowy</li>
</ul>



<p class="wp-block-paragraph">Obchodzi Cię tylko: <strong>czy potrafi zrobić to co potrzebujesz</strong>.</p>



<p class="wp-block-paragraph">Interfejs w Java to właśnie taka &#8222;umowa&#8221; &#8211; deklaracja &#8222;potrafię to i to&#8221; bez szczegółów &#8222;jak&#8221;.</p>



<h3 class="wp-block-heading">Przykład z życia &#8211; Payment:</h3>



<pre class="wp-block-code"><code>java<br><br>`// INTERFEJS = umowa public interface Payment { boolean processPayment(double amount); String getPaymentStatus(); }<br><br>// IMPLEMENTACJA 1 - Karta kredytowa public class CreditCardPayment implements Payment { private String cardNumber;<br><br>public CreditCardPayment(String cardNumber) {<br>    this.cardNumber = cardNumber;<br>}<br><br>@Override<br>public boolean processPayment(double amount) {<br>    System.out.println("Processing " + amount + " PLN via credit card");<br>    // Tutaj logika połączenia z operatorem kart<br>    return true;<br>}<br><br>@Override<br>public String getPaymentStatus() {<br>    return "Credit card payment successful";<br>}<br><br>}</code></pre>



<pre class="wp-block-code"><code>// IMPLEMENTACJA 2 - BLIK public class BlikPayment implements Payment { private String phoneNumber;<br><br>public BlikPayment(String phoneNumber) {<br>    this.phoneNumber = phoneNumber;<br>}<br><br>@Override<br>public boolean processPayment(double amount) {<br>    System.out.println("Processing " + amount + " PLN via BLIK");<br>    // Tutaj logika BLIK<br>    return true;<br>}<br><br>@Override<br>public String getPaymentStatus() {<br>    return "BLIK payment successful";<br>}<br><br>}<br><br>// UŻYCIE - najważniejsze! public class PaymentProcessor {<br><br>public void executePayment(Payment payment, double amount) {<br>    // Nie wiem CZY to karta, BLIK czy coś innego<br>    // Wiem tylko że payment POTRAFI processPayment()<br>    if (payment.processPayment(amount)) {<br>        System.out.println(payment.getPaymentStatus());<br>    }<br>}<br><br><br>}<br><br>// W praktyce: PaymentProcessor processor = new PaymentProcessor();<br><br>Payment creditCard = new CreditCardPayment("1234-5678"); Payment blik = new BlikPayment("123456789");<br><br>processor.executePayment(creditCard, 100.50); processor.executePayment(blik, 200.00);`</code></pre>



<h3 class="wp-block-heading">Co mnie zaskoczyło?</h3>



<p class="wp-block-paragraph"><strong>PaymentProcessor nie wie,</strong> czy dostaje kartę czy BLIK. Wie tylko że dostaje coś co implementuje <code>Payment</code>. I to wystarczy!</p>



<p class="wp-block-paragraph">To jest <strong>cała magia interfejsów</strong> &#8211; loose coupling, flexibility, extensibility.</p>



<h2 class="wp-block-heading">Dlaczego interfejsy są lepsze niż klasy abstrakcyjne?</h2>



<p class="wp-block-paragraph">To było moje największe &#8222;aha!&#8221; tego tygodnia.</p>



<h3 class="wp-block-heading">Klasa abstrakcyjna:</h3>



<pre class="wp-block-code"><code>java<br><br>`public abstract class Animal { protected String name;<br><br>public Animal(String name) {<br>    this.name = name;<br>}<br><br>public abstract void makeSound();<br><br>public void sleep() {  // Konkretna implementacja<br>    System.out.println(name + " is sleeping");<br>}<br><br><br>}<br><br>public class Dog extends Animal { public Dog(String name) { super(name); }<br><br>@Override<br>public void makeSound() {<br>    System.out.println("Woof!");<br>}<br><br><br>}`</code></pre>



<p class="wp-block-paragraph"><strong>Problem:</strong> Dog może dziedziczyć tylko z JEDNEJ klasy. Co jeśli Dog ma być też <code>Trainable</code>? Nie można.</p>



<h3 class="wp-block-heading">Interfejsy &#8211; <strong>wiele implementacji</strong>!</h3>



<pre class="wp-block-code"><code>java<br><br>`public interface Animal { void makeSound(); }<br><br>public interface Trainable { void train(String command); boolean isTraned(); }<br><br>public interface Playful { void play(); }<br><br>// Jedna klasa, WIELE interfejsów! public class Dog implements Animal, Trainable, Playful { private String name; private boolean trained = false;<br><br>@Override<br>public void makeSound() {<br>    System.out.println("Woof!");<br>}<br><br>@Override<br>public void train(String command) {<br>    System.out.println("Training: " + command);<br>    trained = true;<br>}<br><br>@Override<br>public boolean isTrained() {<br>    return trained;<br>}<br><br>@Override<br>public void play() {<br>    System.out.println("Playing fetch!");<br>}<br><br>}`</code></pre>



<p class="wp-block-paragraph"><strong>Java nie ma multiple inheritance (dziedziczenia wielokrotnego) ale ma multiple implementation (implementacji wielokrotnych)!</strong></p>



<p class="wp-block-paragraph">To rozwiązuje problem &#8222;co jeśli potrzebuję cech z wielu źródeł&#8221;.</p>



<h2 class="wp-block-heading">Kiedy używać czego? (moja ściąga)</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Użyj INTERFEJSU gdy&#8230;</th><th class="has-text-align-left" data-align="left">Użyj KLASY ABSTRAKCYJNEJ gdy&#8230;</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Określasz &#8222;co klasa potrafi&#8221;</td><td class="has-text-align-left" data-align="left">Definiujesz &#8222;czym klasa jest&#8221;</td></tr><tr><td class="has-text-align-left" data-align="left">Potrzebujesz wielu źródeł zachowań</td><td class="has-text-align-left" data-align="left">Masz wspólny kod do współdzielenia</td></tr><tr><td class="has-text-align-left" data-align="left">Chcesz loose coupling</td><td class="has-text-align-left" data-align="left">Masz silną relację hierarchiczną</td></tr><tr><td class="has-text-align-left" data-align="left">Przykład: Flyable, Swimmable, Payable</td><td class="has-text-align-left" data-align="left">Przykład: Animal, Vehicle, Shape</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>Praktyczna zasada:</strong> Domyślnie używaj interfejsów. Klasy abstrakcyjne tylko, gdy naprawdę potrzebujesz współdzielić implementację.</p>



<h2 class="wp-block-heading">Mój projekt &#8211; Therapy Management System</h2>



<p class="wp-block-paragraph">Postanowiłam stworzyć coś użytecznego &#8211; system zarządzania terapiami mojego dziecka.</p>



<h3 class="wp-block-heading">Design z interfejsami:</h3>



<pre class="wp-block-code"><code>java<br><br>`// INTERFEJSY - umowy public interface Schedulable { LocalDateTime getDateTime(); int getDuration(); boolean reschedule(LocalDateTime newTime); }<br><br>public interface Billable { double getCost(); boolean isPaid(); void markAsPaid(); }<br><br>public interface Reportable { String generateReport(); Map&lt;String, Object> getStatistics(); }<br><br>// IMPLEMENTACJA - terapia ma wszystkie 3 cechy public class TherapySession implements Schedulable, Billable, Reportable { private String therapyType; // "SI", "Logopeda", "Pedagog" private LocalDateTime dateTime; private int durationMinutes; private double cost; private boolean paid; private String notes;<br><br>public TherapySession(String type, LocalDateTime dateTime, <br>                     int duration, double cost) {<br>    this.therapyType = type;<br>    this.dateTime = dateTime;<br>    this.durationMinutes = duration;<br>    this.cost = cost;<br>    this.paid = false;<br>}<br><br>// Schedulable methods<br>@Override<br>public LocalDateTime getDateTime() {<br>    return dateTime;<br>}<br><br>@Override<br>public int getDuration() {<br>    return durationMinutes;<br>}<br><br>@Override<br>public boolean reschedule(LocalDateTime newTime) {<br>    this.dateTime = newTime;<br>    System.out.println("Rescheduled to: " + newTime);<br>    return true;<br>}<br><br>// Billable methods<br>@Override<br>public double getCost() {<br>    return cost;<br>}<br><br>@Override<br>public boolean isPaid() {<br>    return paid;<br>}<br><br>@Override<br>public void markAsPaid() {<br>    this.paid = true;<br>    System.out.println("Marked as paid: " + cost + " PLN");<br>}<br><br>// Reportable methods<br>@Override<br>public String generateReport() {<br>    return String.format("Therapy: %s | Date: %s | Duration: %d min | Cost: %.2f PLN | Paid: %s",<br>        therapyType, dateTime, durationMinutes, cost, paid ? "Yes" : "No");<br>}<br><br>@Override<br>public Map&lt;String, Object> getStatistics() {<br>    Map&lt;String, Object> stats = new HashMap&lt;>();<br>    stats.put("type", therapyType);<br>    stats.put("duration", durationMinutes);<br>    stats.put("cost", cost);<br>    stats.put("paid", paid);<br>    return stats;<br>}<br><br>}<br><br>// MANAGEMENT CLASSES - pracują z interfejsami! public class BillingManager {<br><br>public double calculateTotalUnpaid(List&lt;Billable> items) {<br>    return items.stream()<br>        .filter(item -> !item.isPaid())<br>        .mapToDouble(Billable::getCost)<br>        .sum();<br>}<br><br>public void processPayments(List&lt;Billable> items) {<br>    items.stream()<br>        .filter(item -> !item.isPaid())<br>        .forEach(item -> {<br>            item.markAsPaid();<br>        });<br>}<br><br>}<br><br>public class ScheduleManager {<br><br>public List&lt;Schedulable> getUpcoming(List&lt;Schedulable> items) {<br>    LocalDateTime now = LocalDateTime.now();<br>    return items.stream()<br>        .filter(item -> item.getDateTime().isAfter(now))<br>        .sorted(Comparator.comparing(Schedulable::getDateTime))<br>        .toList();<br>}<br><br>}<br><br>public class ReportGenerator {<br><br>public void generateMonthlyReport(List&lt;Reportable> items) {<br>    System.out.println("=== MONTHLY REPORT ===");<br>    items.forEach(item -> {<br>        System.out.println(item.generateReport());<br>    });<br>}<br><br>}`</code></pre>



<h3 class="wp-block-heading">Użycie w praktyce:</h3>



<pre class="wp-block-code"><code>java<br><br>`public class Main { public static void main(String&#91;] args) { // Tworzę sesje terapii List&lt;TherapySession> sessions = new ArrayList&lt;>();<br><br>    sessions.add(new TherapySession("SI", <br>        LocalDateTime.of(2026, 3, 20, 14, 0), 60, 75.00));<br>    sessions.add(new TherapySession("Logopeda", <br>        LocalDateTime.of(2026, 3, 22, 10, 0), 45, 65.00));<br>    sessions.add(new TherapySession("Pedagog", <br>        LocalDateTime.of(2026, 3, 25, 15, 0), 60, 60.00));<br>    <br>    // Billing - obsługuje Billable<br>    BillingManager billing = new BillingManager();<br>    double unpaid = billing.calculateTotalUnpaid(<br>        new ArrayList&lt;>(sessions));  // TherapySession implements Billable!<br>    System.out.println("Total unpaid: " + unpaid + " PLN");<br>    <br>    // Schedule - obsługuje Schedulable<br>    ScheduleManager schedule = new ScheduleManager();<br>    List&lt;Schedulable> upcoming = schedule.getUpcoming(<br>        new ArrayList&lt;>(sessions));  // TherapySession implements Schedulable!<br>    System.out.println("Upcoming sessions: " + upcoming.size());<br>    <br>    // Reports - obsługuje Reportable<br>    ReportGenerator reports = new ReportGenerator();<br>    reports.generateMonthlyReport(<br>        new ArrayList&lt;>(sessions));  // TherapySession implements Reportable!<br>}<br><br>}<br><br><br>**Output:**<br><br>Total unpaid: 200.00 PLN Upcoming sessions: 3 === MONTHLY REPORT === Therapy: SI | Date: 2026-03-20T14:00 | Duration: 60 min | Cost: 75.00 PLN | Paid: No Therapy: Logopeda | Date: 2026-03-22T10:00 | Duration: 45 min | Cost: 65.00 PLN | Paid: No Therapy: Pedagog | Date: 2026-03-25T15:00 | Duration: 60 min | Cost: 60.00 PLN | Paid: No`</code></pre>



<h3 class="wp-block-heading">Dlaczego to jest piękne?</h3>



<p class="wp-block-paragraph"><code>BillingManager</code> nie wie, że pracuje z <code>TherapySession</code>. Wie tylko, że dostaje <code>Billable</code>.</p>



<p class="wp-block-paragraph">Jutro mogę dodać <code>DoctorVisit implements Billable</code> i <code>BillingManager</code> będzie działać BEZ ZMIAN!</p>



<p class="wp-block-paragraph"><strong>To jest siła interfejsów &#8211; rozszerzalność bez modyfikacji istniejącego kodu.</strong></p>



<h2 class="wp-block-heading">Default methods w interfejsach (Java 8+)</h2>



<p class="wp-block-paragraph">To mnie totalnie zaskoczyło &#8211; interfejsy mogą mieć implementację!</p>



<pre class="wp-block-code"><code>java<br><br>`public interface Reportable { String generateReport();<br><br>// DEFAULT METHOD - konkretna implementacja!<br>default void printReport() {<br>    System.out.println("=== REPORT ===");<br>    System.out.println(generateReport());<br>    System.out.println("==============");<br>}<br><br>default String getShortSummary() {<br>    String full = generateReport();<br>    return full.substring(0, Math.min(50, full.length())) + "...";<br>}<br><br>}`</code></pre>



<p class="wp-block-paragraph">Teraz każda klasa implementująca <code>Reportable</code> automatycznie dostaje <code>printReport()</code> i <code>getShortSummary()</code>!</p>



<p class="wp-block-paragraph"><strong>Kiedy używać:</strong></p>



<ul class="wp-block-list">
<li>Gdy większość implementacji będzie miała tą samą logikę</li>



<li>Gdy chcesz dodać metodę do interfejsu bez łamania istniejącego kodu</li>
</ul>



<h2 class="wp-block-heading">Typowe błędy które popełniłam</h2>



<h3 class="wp-block-heading">1. Zbyt duże interfejsy (<strong>zanieczyszczenie interfejsów</strong>)</h3>



<p class="wp-block-paragraph"><strong>Błąd:</strong></p>



<pre class="wp-block-code"><code>java<br><br><code>public interface TherapyManagement { void schedule(); void reschedule(); void cancel(); double getCost(); void markAsPaid(); String generateReport(); void sendReminder(); void exportToCalendar(); // ... 20 metod później }</code></code></pre>



<p class="wp-block-paragraph"><strong>Lekcja:</strong> To narusza ISP (Interface Segregation Principle &#8211; Zasada Segregacji Interfejsów ). Lepiej wiele małych interfejsów niż jeden wielki.</p>



<p class="wp-block-paragraph"><strong>Poprawka:</strong> Rozdziel na <code>Schedulable</code>, <code>Billable</code>, <code>Reportable</code>, <code>Notifiable</code>.</p>



<h3 class="wp-block-heading">2. Interfejs z jedną metodą bez sensu</h3>



<p class="wp-block-paragraph"><strong>Błąd:</strong></p>



<pre class="wp-block-code"><code>java<br><br><code>public interface CanExist { boolean exists(); }</code></code></pre>



<p class="wp-block-paragraph"><strong>Lekcja:</strong> Nie każda metoda potrzebuje interfejsu. Czasem po prostu metoda w klasie wystarczy.</p>



<h3 class="wp-block-heading">3. Mieszanie abstrakcji</h3>



<p class="wp-block-paragraph"><strong>Błąd:</strong></p>



<pre class="wp-block-code"><code>java<br><br><code>public interface Payment { boolean processPayment(double amount); void setCardNumber(String card); // Co jeśli to BLIK? Nie ma karty! }</code></code></pre>



<p class="wp-block-paragraph"><strong>Lekcja:</strong> Interfejs powinien opisywać zachowanie wspólne dla WSZYSTKICH implementacji.</p>



<h2 class="wp-block-heading">Functional Interfaces &#8211; bonus</h2>



<p class="wp-block-paragraph">Odkryłam że interfejs z JEDNĄ metodą abstrakcyjną to &#8222;functional interface&#8221; i może być użyty z lambda!</p>



<pre class="wp-block-code"><code>java<br><br>`@FunctionalInterface public interface TherapyCostCalculator { double calculate(int sessions, double pricePerSession); }<br><br>// Użycie z lambdą: TherapyCostCalculator standard = (sessions, price) -> sessions * price; TherapyCostCalculator withDiscount = (sessions, price) -> sessions * price * 0.9; // 10% discount<br><br>System.out.println("Standard: " + standard.calculate(8, 75)); // 600.0 System.out.println("Discount: " + withDiscount.calculate(8, 75)); // 540.0`</code></pre>



<p class="wp-block-paragraph">To otwiera drogę do <strong>programowania funkcyjnego</strong> w Java!</p>



<h2 class="wp-block-heading">Koniec podstaw Zajavka &#8211; co dalej?</h2>



<p class="wp-block-paragraph"><strong>Tydzień 12 = koniec fundamentów</strong>. Przeszłam przez:</p>



<ul class="wp-block-list">
<li>Podstawy składni Java</li>



<li>OOP (klasy, obiekty, dziedziczenie)</li>



<li>Agregacja i kompozycja</li>



<li><strong>Interfejsy i klasy abstrakcyjne</strong> ✓</li>
</ul>



<p class="wp-block-paragraph"><strong>Co dalej &#8211; moje opcje:</strong></p>



<h3 class="wp-block-heading">Opcja 1: Zajavka &#8211; poziom zaawansowany</h3>



<ul class="wp-block-list">
<li>Spring Framework</li>



<li>Hibernate / JPA</li>



<li>REST APIs</li>



<li>Microservices</li>
</ul>



<p class="wp-block-paragraph"><strong>Plusy:</strong> Kontynuacja, naturalny postęp, solidna backend-dev ścieżka <strong>Minusy:</strong> Jeszcze więcej Java, może za ciężkie przy dzieciach</p>



<h3 class="wp-block-heading">Opcja 2: JavaScript</h3>



<ul class="wp-block-list">
<li>Naturalny krok dla freelancerki WordPress</li>



<li>Synergia z moją pracą</li>



<li>Frontend interaktywność</li>
</ul>



<p class="wp-block-paragraph"><strong>Plusy:</strong> Praktyczne dla mojej kariery, lżejsze od Springa, już mam podstawy JS <strong>Minusy:</strong> Restart w kolejnym języku, powtarzanie podstaw</p>



<h3 class="wp-block-heading">Opcja 3: Konsolidacja + Budowa</h3>



<ul class="wp-block-list">
<li>Zatrzymać się na podstawach Java</li>



<li>Zbudować 2-3 solidne projekty</li>



<li>Pokazać portfolio</li>
</ul>



<p class="wp-block-paragraph"><strong>Plusy:</strong> Solidne fundamenty, działający kod <strong>Minusy:</strong> Może za mało dla ryneku pracy</p>



<p class="wp-block-paragraph"><strong>Moja decyzja:</strong> Myślę, że&#8230; <strong>JavaScript</strong>. Powody:</p>



<ol class="wp-block-list">
<li>Synergia z WordPress (mogę od razu używać w pracy!)</li>



<li>Łatwiejszy balans z dziećmi (dużo mniej ciężki niż Spring)</li>



<li>Frontend umiejętności są wartościowe</li>



<li>Zawsze mogę wrócić do Java później</li>
</ol>



<h2 class="wp-block-heading">Podsumowanie nauki Java &#8211; 17 tygodni</h2>



<p class="wp-block-paragraph"><strong>Co osiągnęłam:</strong> <br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Podstawy składni Java &#8211; solidnie <br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> OOP &#8211; rozumiem i używam <br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Agregacja/kompozycja &#8211; odhaczone <br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Interfejsy &#8211; w końcu rozumiem! <br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2 projekty robocze (Family system, Therapy Management)</p>



<p class="wp-block-paragraph"><strong>Statystyki:</strong></p>



<ul class="wp-block-list">
<li>17 tygodni (zamiast 12)</li>



<li>~120 godzin nauki całościowo</li>



<li>~7h tygodniowo średnio</li>



<li>2 pełne projekty</li>



<li>Setki linii kodu</li>
</ul>



<p class="wp-block-paragraph"><strong>Czy było warto? TAK.</strong> Java nauczyła mnie:</p>



<ul class="wp-block-list">
<li>Myślenia obiektowo</li>



<li>Projektowania systemów</li>



<li>Że mogę uczyć się programowania przy dzieciach</li>



<li>Że 1h dziennie wystarczy</li>
</ul>



<p class="wp-block-paragraph"><strong>Następny krok:</strong> Learning Log #4 będzie o&#8230; JavaScript albo <em>o PHP</em> (?!) ! Czekać na dalsze informacje.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>PS: Też kończycie kurs/etap nauki? Co dalej planujesz? Zostaw komentarz &#8211; ciekawa jestem Waszych ścieżek. A jeśli macie pytania o interfejsy w Java &#8211; pytajcie, teraz gdy w końcu rozumiem chętnie pomogę!</em></p>



<p class="wp-block-paragraph"></p>
<p>Artykuł <a href="https://www.danuta-cybulska.com/learning-log-3-interfejsy-java-zajavka-koniec-podstaw/">Learning Log #3: Tydzień 12 Zajavka &#8211; interfejsy, klasy abstrakcyjne i koniec podstaw Java</a> pochodzi z serwisu <a href="https://www.danuta-cybulska.com">To co najważniejsze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.danuta-cybulska.com/learning-log-3-interfejsy-java-zajavka-koniec-podstaw/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
