Staattiset kentät ja vakiot
Käytä staattisia kenttiä jaettuun tilaan, static final -määrityksiä vakioihin ja staattisia alustajia.
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()); // 3Vakiot 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")); // 30Staattinen 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()); // 1001Singleton 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()); // 20Staattinen 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, TimeUnitStaattisten 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.5Muuttuvat 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.08Kä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
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
- Metodien ylikuormituksen säännöt
- Varargs-parametrit
- Staattiset kentät ja vakiot
- Apuohjelmaluokat ja staattiset factory-metodit