Java Academy · Oppitunti

Staattiset kentät ja vakiot

Käytä staattisia kenttiä jaettuun tilaan, static final -määrityksiä vakioihin ja staattisia alustajia.

Oppitunti 3/413 vaihetta

Staattiset kentät ja vakiot on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Staattiset kentät ja vakiot

Staattiset kentät kuuluvat luokalle eivätkä ilmentymille. Kaikki luokan oliot jakavat ne. Vakiot yhdistävät static- ja final-määreet luokkatasolla muuttumattomien arvojen luomiseksi.

Staattiset ja ilmentymäkentät

Ilmentymäkentästä on erillinen kopio jokaista oliota varten. Staattisesta kentästä on yksi kopio, jonka kaikki luokan oliot jakavat.

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());       // 3

Vakiot static final -määreillä

Määritä vakiot muodossa public static final. Käytännön mukaan niiden nimissä käytetään muotoa 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;
}

Staattiset alustajalohkot

Kun vakio vaatii monimutkaisen alustuksen, käytä staattista alustajalohkoa, joka suoritetaan kerran luokan lataamisen yhteydessä.

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")); // 30

Staattinen laskurimalli

Staattisia kenttiä käytetään usein tunnisteiden luomiseen, metriikoiden laskemiseen tai jaettujen välimuistien toteuttamiseen.

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()); // 1001

Singleton staattisen kentän avulla

Singletonissa staattinen kenttä sisältää ainoan ilmentymän. Käytä laiskaa alustusta luokille, joita ei välttämättä aina tarvita.

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()); // 20

Staattinen import

import static mahdollistaa staattisten jäsenten käyttämisen ilman luokan nimen etuliitettä — tämä on hyödyllistä vakioiden ja apumetodien kanssa.

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, TimeUnit

Staattisten kenttien säieturvallisuus

Säikeiden kesken jaetut staattiset kentät edellyttävät synkronointia tai atomisia tyyppejä kilpailutilanteiden välttämiseksi.

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.5

Muuttuvat staattiset kentät: sudenkuopat

Muuttuvat staattiset kentät ovat vaarallisia: globaalia muuttuvaa tilaa on vaikea testata, se ei ole ilman huolellista toteutusta säieturvallista ja se luo luokkien välille piilokytkentöjä.

// 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; }
}

Vakiot sisältävä rajapinta – antimalli

Rajapinnan käyttäminen vakioiden säilyttämiseen ("Constant Interface" -antimalli) ei ole suositeltavaa. Käytä sen sijaan luokkaa, jolla on private-konstruktori.

// 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.08

Käytännössä: ominaisuusliput vakioiden avulla

Staattisten final-tyyppisten boolean-vakioiden käyttäminen käännösaikaisiin ominaisuuslippuihin — JIT-kääntäjä poistaa kuolleet haarat.

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");
}

Pikatarkistus

Mitä eroa on staattisella kentällä ja ilmentymäkentällä?

Kertaus: staattiset kentät ja vakiot

Keskeiset opit:

  • Staattiset kentät kuuluvat luokalle — yksi kaikkien ilmentymien jakama kopio
  • Vakiot: public static final UPPER_SNAKE_CASE
  • Käytä staattisia alustajalohkoja vakiolle, joka vaatii monimutkaisen alustuksen
  • Suosi AtomicLongia/AtomicIntegeria muuttuville staattisille kentille samanaikaisessa koodissa
  • Vältä muuttuvia staattisia kenttiä — ne luovat piilotettua globaalia tilaa, jota on vaikea testata
  • Käytä vakioille rajapinnan sijaan instansioimatonta luokkaa, jolla on private-konstruktori
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Staattiset kentät ja vakiot” ilmainen?

Kyllä – oppitunnin ”Staattiset kentät ja vakiot” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Staattiset kentät ja vakiot”?

Käytä staattisia kenttiä jaettuun tilaan, static final -määrityksiä vakioihin ja staattisia alustajia. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Staattiset kentät ja vakiot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Metodien ylikuormituksen säännöt
  2. Varargs-parametrit
  3. Staattiset kentät ja vakiot
  4. Apuohjelmaluokat ja staattiset factory-metodit
← Takaisin: Java Academy