A konstruktor egy speciális metódus, amely akkor fut le, amikor egy objektum létrejön, és az objektum állapotát egy érvényes kezdeti állapotba inicializálja. A destruktor (vagy finalizáló) akkor fut le, amikor egy objektum megsemmisül, és az erőforrások felszabadítására szolgál.
Felépítés
public class Connection {
private final String host;
public Connection(String host) { // constructor
if (host == null) // enforce a valid object from birth
throw new IllegalArgumentException("host required");
this.host = host; // initialize state
}
}
Egy jó konstruktor biztosítja, hogy az objektum soha nem megfigyelhetetlen érvénytelen állapotban.
A felszabadítás nyelvek szerint eltérő
class FileWriter:
def __init__(self, path):
self.f = open(path, "w") # acquire resource
def close(self):
self.f.close() # explicit cleanup
def __enter__(self): return self
def __exit__(self, *a): self.close() # deterministic cleanup
with FileWriter("out.txt") as w: # closed automatically at block end
pass
| Nyelv | Felszabadítási mechanizmus |
|---|---|
| C++ | Destruktor ~T(), determinisztikusan fut le |
| Java/C# | GC + finalize/Dispose (nem-determinisztikus; használjon try-with-resources / using) |
| Python | __del__ (megbízhatatlan időzítés); helyezzen előtérbe context managereket |
Csapda
Szemétgyűjtés nyelvekben soha ne támaszkodjon finalizálókra fájlok, szoketek vagy zárak felszabadítására — azok időzítése nem definiált. Használjon explicit close/Dispose/context managereket.
Miért fontos
A konstruktorok az Ön garanciája arra, hogy minden objektum érvényesen indul — az egyetlen legjobb hely a szükséges argumentumok és invariánsok érvényesítésére.
A felszabadítás fontos, mert a korlátozott erőforrások (fájlleírók, kapcsolatok) szivárognak, ha nem szabadítjuk fel őket, és ha a GC-re támaszkodunk, szaggatott, nehezen debuggolható kimerülést okoz.
