Field Statis dan Konstanta
Gunakan field statis untuk status bersama, konstanta dengan static final, dan penginisialisasi statis.
Field Statis dan Konstanta adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Field Statis dan Konstanta
Field statis dimiliki oleh kelas, bukan oleh instance. Field tersebut digunakan bersama oleh semua objek dari kelas tersebut. Konstanta menggabungkan static dan final untuk membuat nilai tingkat kelas yang tidak dapat diubah.
Field Statis vs Field Instance
Field instance memiliki salinan terpisah untuk setiap objek. Field statis memiliki satu salinan yang digunakan bersama oleh semua objek dari kelas tersebut.
class Counter {
private static int totalCount = 0; // shared across all instances
private int instanceId; // unique per instance
Counter() {
totalCount++;
instanceId = totalCount;
}
static int getTotalCount() { return totalCount; }
int getInstanceId() { return instanceId; }
}
Counter c1 = new Counter();
Counter c2 = new Counter();
Counter c3 = new Counter();
System.out.println(Counter.getTotalCount()); // 3
System.out.println(c1.getInstanceId()); // 1
System.out.println(c3.getInstanceId()); // 3Konstanta dengan static final
Deklarasikan konstanta sebagai public static final. Berdasarkan konvensi, namanya menggunakan SCREAMING_SNAKE_CASE.
class MathConstants {
public static final double PI = 3.141592653589793;
public static final double E = 2.718281828459045;
public static final double GOLDEN = 1.618033988749895;
public static final int PRIMES[] = {2, 3, 5, 7, 11, 13};
}
// Access without an instance
System.out.println(MathConstants.PI);
// Constants on domain classes
class HttpStatus {
public static final int OK = 200;
public static final int NOT_FOUND = 404;
public static final int SERVER_ERR = 500;
}Blok Inisialisasi Statis
Jika konstanta memerlukan inisialisasi yang kompleks, gunakan blok inisialisasi statis yang dijalankan sekali saat kelas dimuat.
import java.util.*;
class Config {
public static final Map<String, String> DEFAULTS;
static {
Map<String, String> map = new HashMap<>();
map.put("timeout", "30");
map.put("maxRetry", "3");
map.put("logLevel", "INFO");
DEFAULTS = Collections.unmodifiableMap(map);
}
}
System.out.println(Config.DEFAULTS.get("timeout")); // 30Pola Counter Statis
Field statis biasanya digunakan untuk membuat ID, menghitung metrik, atau menyimpan cache bersama.
import java.util.concurrent.atomic.AtomicLong;
class Order {
private static final AtomicLong ID_SEQUENCE = new AtomicLong(1000);
private final long id;
private final String item;
Order(String item) {
this.id = ID_SEQUENCE.getAndIncrement();
this.item = item;
}
long getId() { return id; }
String getItem() { return item; }
}
Order o1 = new Order("Laptop");
Order o2 = new Order("Mouse");
System.out.println(o1.getId()); // 1000
System.out.println(o2.getId()); // 1001Singleton melalui Field Statis
Field statis menyimpan satu-satunya instance dalam Singleton. Gunakan inisialisasi malas untuk kelas yang mungkin tidak selalu diperlukan.
class DatabasePool {
private static volatile DatabasePool instance;
private final int maxConnections;
private DatabasePool() { this.maxConnections = 20; }
public static DatabasePool getInstance() {
if (instance == null) {
synchronized (DatabasePool.class) {
if (instance == null)
instance = new DatabasePool();
}
}
return instance;
}
public int getMaxConnections() { return maxConnections; }
}
System.out.println(DatabasePool.getInstance().getMaxConnections()); // 20Impor Statis
import static memungkinkan Anda menggunakan anggota statis tanpa awalan nama kelas — berguna untuk konstanta dan metode utilitas.
import static java.lang.Math.PI;
import static java.lang.Math.sqrt;
import static java.lang.Math.pow;
// Without import static: Math.PI * Math.pow(r, 2)
double radius = 5.0;
double area = PI * pow(radius, 2);
System.out.printf("Area: %.2f%n", area); // 78.54
// Caution: overuse of static imports hurts readability
// Acceptable for: Math.*, Assert.* in tests, TimeUnitKeamanan Thread pada Field Statis
Field statis yang digunakan bersama oleh beberapa thread memerlukan sinkronisasi atau tipe atomik untuk menghindari kondisi balapan.
import java.util.concurrent.atomic.*;
class RequestMetrics {
private static final AtomicLong requestCount = new AtomicLong(0);
private static final AtomicLong totalLatencyMs = new AtomicLong(0);
public static void record(long latencyMs) {
requestCount.incrementAndGet();
totalLatencyMs.addAndGet(latencyMs);
}
public static double averageLatency() {
long count = requestCount.get();
return count == 0 ? 0 : (double) totalLatencyMs.get() / count;
}
}
RequestMetrics.record(45);
RequestMetrics.record(120);
System.out.println(RequestMetrics.averageLatency()); // 82.5Bahaya Field Statis yang Dapat Diubah
Field statis yang dapat diubah berbahaya: state global yang dapat diubah sulit diuji, tidak aman untuk thread jika tidak ditangani dengan baik, dan menciptakan keterikatan tersembunyi antarkelas.
// BAD: mutable static state
class GlobalConfig {
public static String environment = "dev"; // mutable global!
}
// Any code anywhere can change GlobalConfig.environment
// Very hard to test, unexpected interactions
// BETTER: immutable constant
class GlobalConfig2 {
public static final String ENVIRONMENT =
System.getenv().getOrDefault("APP_ENV", "dev");
}
// BEST: inject via constructor (dependency injection)
class Service {
private final String environment;
Service(String environment) { this.environment = environment; }
}Antipola Antarmuka Konstanta
Menggunakan antarmuka untuk menyimpan konstanta (antipola "Antarmuka Konstanta") tidak disarankan. Sebagai gantinya, gunakan kelas dengan konstruktor privat.
// BAD: constant interface — pollutes the namespace of implementing classes
interface FinancialConstants {
double TAX_RATE = 0.08; // implicitly public static final
}
// GOOD: utility class for constants
final class FinancialConstants2 {
private FinancialConstants2() {} // prevent instantiation
public static final double TAX_RATE = 0.08;
public static final double VAT_RATE = 0.20;
public static final int MAX_ITEMS = 100;
}
System.out.println(FinancialConstants2.TAX_RATE); // 0.08Praktik: Penanda Fitur melalui Konstanta
Menggunakan konstanta boolean static final sebagai penanda fitur pada waktu kompilasi — kompiler JIT menghapus cabang yang tidak pernah dijalankan.
class Features {
public static final boolean ENABLE_ANALYTICS = true;
public static final boolean ENABLE_AI_SEARCH = false;
public static final boolean DEBUG_MODE =
"true".equals(System.getenv("DEBUG"));
}
// The JIT eliminates this if-block when ENABLE_AI_SEARCH is false:
if (Features.ENABLE_AI_SEARCH) {
System.out.println("Running AI search...");
}
if (Features.DEBUG_MODE) {
System.out.println("[DEBUG] Request received");
}Pemeriksaan Singkat
Apa perbedaan antara field statis dan field instance?
Ringkasan: Field Statis dan Konstanta
Hal-hal penting:
- Field statis dimiliki oleh kelas — satu salinan digunakan bersama oleh semua instance
- Konstanta: public static final UPPER_SNAKE_CASE
- Gunakan blok inisialisasi statis untuk konstanta yang memerlukan inisialisasi kompleks
- Lebih baik gunakan AtomicLong/AtomicInteger untuk field statis yang dapat diubah dalam kode konkuren
- Hindari field statis yang dapat diubah — field tersebut menciptakan state global tersembunyi yang sulit diuji
- Gunakan kelas yang tidak dapat dibuat instance-nya (konstruktor privat) untuk konstanta, bukan antarmuka
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Field Statis dan Konstanta” gratis?
Ya — teks lengkap “Field Statis dan Konstanta” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Field Statis dan Konstanta”?
Gunakan field statis untuk status bersama, konstanta dengan static final, dan penginisialisasi statis. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Field Statis dan Konstanta” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Aturan Overloading Metode
- Parameter Varargs
- Field Statis dan Konstanta
- Class Utilitas dan Metode Pabrik Statis