Konstruktor je posebna metoda, ki se izvede, ko je objekt ustvarjen, namenjena inicializaciji njegovega stanja v veljavno začetno stanje. Destruktor (ali finalizer) se izvede, ko je objekt uništen, namenjen čiščenju virov.
Konstrukcija
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
}
}
Dobra konstruktor zagotavlja, da je objekt nikoli opazljiv v neveljavnem stanju.
Čiščenje se razlikuje glede na jezik
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
| Jezik | Mehanizem čiščenja |
|---|---|
| C++ | Destruktor ~T(), se izvede deterministično |
| Java/C# | GC + finalize/Dispose (nedeterminističen; uporabite try-with-resources / using) |
| Python | __del__ (nezanesljivo časovanje); raje uporabite context managers |
Nevarnost
V jezikih z zbiranjem smeti nikoli se ne zanašajte na finalizers za sproščanje datotek, vtičnikov ali zaklepanja — njihovo časovanje je nedoločeno. Uporabite eksplicitne close/Dispose/context managers.
Zakaj je to pomembno
Konstruktorji vam zagotavljajo, da je vsak objekt začet veljaven — najbolje mesto za uveljavitev zahtevanih argumentov in invariant.
Čiščenje je pomembno, ker se končni viri (ročaji datotek, povezave) izgubijo, če niso sproščeni, in zanašanje na GC zanje povzroči občasno, težko odkrivljivo izčrpanje.
