0Pricing
Java Academy · Ders

Optional için En İyi Uygulamalar

orElse, orElseGet ve orElseThrow yöntemlerini uygulayın ve yaygın Optional karşıtı kalıplardan kaçının.

Optional için En İyi Uygulamalar, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Optional İçin En İyi Uygulamalar

Optional, doğru kullanıldığında güçlü bir araçtır. Bu derste, gerçek dünyadaki kod tabanlarından somut örneklerle yapılması ve kaçınılması gerekenler ele alınır.

Yapın: Dönüş Türü Olarak Optional Kullanın

Optional'ın temel kullanım alanı, bir değer bulamayabilecek veya üretemeyebilecek yöntemlerin dönüş türü olmasıdır.

import java.util.Optional;

// Good: signals to caller that result might be absent
public Optional<User> findByUsername(String username) { ... }
public Optional<Config> getConfig(String key) { ... }
public Optional<String> getHeader(String name) { ... }

// These are all cases where absence is a normal outcome,
// not an exceptional condition

Yapmayın: Alan Olarak Optional

Optional alanları nesne yükünü artırır ve serileştirmeyi karmaşıklaştırır. Sınıfların içindeki isteğe bağlı alanlar için boş değer veya özel bir gösterge değeri kullanın.

// BAD
class User {
    private Optional<String> middleName; // wrong
}

// GOOD: use null for absent optional field
class User {
    private final String middleName; // null = absent
    public Optional<String> middleName() {
        return Optional.ofNullable(middleName); // expose as Optional in getter
    }
}
User u = new User(null); // null field
System.out.println(u.middleName().isPresent()); // false

Yapmayın: Yöntem Parametresi Olarak Optional

Optional parametreleri, çağıranları değerleri gereksiz yere Optional içinde sarmalamaya zorlar. Bunun yerine aşırı yükleme veya @Nullable kullanın.

// BAD
void sendNotification(String message, Optional<String> subject) { ... }
// caller must write: sendNotification("Hello", Optional.of("News"))

// GOOD: overloading
void sendNotification(String message) { sendNotification(message, null); }
void sendNotification(String message, String subject) {
    // subject may be null
}
// caller writes: sendNotification("Hello", "News") — clean

Yapmayın: Koleksiyonlarda Optional

Optional'ları hiçbir zaman bir List, küme veya eşleme değerinin içine koymayın. Koleksiyonlardaki boş Optional'lar anlamsızdır — girdiyi doğrudan atlayın.

// BAD: List of Optionals
List<Optional<User>> results = ...; // meaningless empty Optionals

// GOOD: List of present values only
List<User> presentUsers = maybeUsers.stream()
    .flatMap(Optional::stream)
    .collect(Collectors.toList());

// BAD: Map with Optional values
Map<String, Optional<String>> config = ...;

// GOOD: just use null or omit the key for absent values
Map<String, String> config2 = ...;
String value = config2.getOrDefault("key", "default");

Yapın: Maliyetli Varsayılanlar için orElseGet

Varsayılan değer bir hesaplama içerdiğinde (veritabanı sorgusu, ağ çağrısı) her zaman orElseGet kullanın — sağlayıcı yalnızca gerektiğinde çağrılır.

import java.util.Optional;

// BAD: buildDefault() always called, even when value is present!
String config = getConfig("timeout").orElse(buildDefault());

// GOOD: supplier called lazily only when empty
String config2 = getConfig("timeout").orElseGet(() -> buildDefault());

// Or with method reference:
String config3 = getConfig("timeout").orElseGet(this::buildDefault);

// For cheap literals, orElse is fine
String name = getConfig("name").orElse("default");

Yapın: Gerekli Değerler için orElseThrow

Eksik bir değer programlama hatası veya değişmezlik ihlaliyse, açıklayıcı bir istisnayla birlikte orElseThrow kullanın.

import java.util.Optional;

// Good: throw when absence is an error
User user = userRepository.findById(userId)
    .orElseThrow(() -> new UserNotFoundException("User not found: " + userId));

// Good: in validation code
String apiKey = Optional.ofNullable(System.getenv("API_KEY"))
    .orElseThrow(() -> new IllegalStateException(
        "API_KEY environment variable is required"));

System.out.println("Key found: " + apiKey.length() + " chars");

Karşı Örüntü: isPresent + get()

isPresent() ile denetleyip ardından get() çağırma karşı örüntüsünden kaçının. Bu, boş değer denetiminden daha iyi değildir ve Optional'ın amacını boşa çıkarır.

import java.util.Optional;

Optional<String> opt = findValue();

// BAD: isPresent() + get() — no improvement over null check
if (opt.isPresent()) {
    String val = opt.get();
    process(val);
}

// GOOD: use the functional API
opt.ifPresent(this::process);

// GOOD: transform and return
return opt.map(this::process).orElse(null);

// GOOD: provide a default
String result = opt.orElse("default");

Zincirleme İçin En İyi Uygulama

Temiz bir zincir oluşturun: bul → filter → dönüştür → fallback. Her adım kendi amacını açıkça belirtir.

import java.util.Optional;

record User(long id, String plan, boolean active) {}

static Optional<User> findUser(long id) { return Optional.empty(); }

String result = findUser(42L)
    .filter(User::active)           // keep only active users
    .filter(u -> "PRO".equals(u.plan())) // keep only PRO users
    .map(u -> "Welcome, Pro user #" + u.id()) // transform
    .orElse("Upgrade to Pro!");     // fallback

System.out.println(result); // Upgrade to Pro!

Hizmet Katmanında Optional

En iyi uygulamaları izleyen gerçekçi bir hizmet katmanı örneği.

import java.util.Optional;

class OrderService {
    public Optional<OrderSummary> getOrderSummary(long orderId) {
        return orderRepo.findById(orderId)
            .filter(o -> !o.isCancelled())
            .map(this::toSummary);
    }

    public OrderSummary requireOrderSummary(long orderId) {
        return getOrderSummary(orderId)
            .orElseThrow(() -> new OrderNotFoundException(orderId));
    }

    private OrderSummary toSummary(Order o) { return new OrderSummary(o); }
}
// API callers choose: Optional (handle absence) or require (exception)

Optional ve Boş Değer Güvenliği Araçları

Optional, eksiksiz boş değer güvenliği sağlamak için @Nullable/@NonNull ek açıklamalarını ve SpotBugs/NullAway gibi araçları tamamlar.

// Annotation-based: declares intent for in-class nulls
import org.jetbrains.annotations.*;

class ProductService {
    @Nullable  // may return null — for framework/bean use
    public String getCachedName(String id) { return cache.get(id); }

    // Optional — for service API that handles absence
    public Optional<Product> findProduct(String id) {
        return repo.findById(id);
    }
}
// Use @Nullable for fields/parameters; Optional for return types

Hızlı Kontrol

Aşağıdaki kodda sorun nedir?

if (opt.isPresent()) {
    process(opt.get());
}

Özet: Optional İçin En İyi Uygulamalar

Temel çıkarımlar:

  • Optional'ı yalnızca dönüş türü olarak kullanın — asla alan veya yöntem parametresi olarak kullanmayın
  • Varsayılan değerin hesaplanması maliyetliyse orElse yerine orElseGet'i tercih edin
  • Yokluk bir programlama hatasını ifade ediyorsa orElseThrow kullanın
  • isPresent() + get() kullanımından kaçının — bunun yerine ifPresent, map veya orElse kullanın
  • Optional'ı asla koleksiyonların içine koymayın — bunun yerine akışları filtreleyin
  • Açık bir veri akışı için okunabilir zincirler oluşturun: filter → map → orElse

Sıkça Sorulan Sorular

“Optional için En İyi Uygulamalar” dersi ücretsiz mi?

Evet — “Optional için En İyi Uygulamalar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Optional için En İyi Uygulamalar” dersinde ne öğreneceğim?

orElse, orElseGet ve orElseThrow yöntemlerini uygulayın ve yaygın Optional karşıtı kalıplardan kaçının. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Optional için En İyi Uygulamalar” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Optional Neden Var?
  2. Optional Oluşturma ve İnceleme
  3. Optional Dönüşümleri: map ve flatMap
  4. Optional için En İyi Uygulamalar
← Java Academy Sayfasına Dön