Im Allgemeinen habe ich immer gesehen Try-with-Ressourcen verwendet, um eine neues Objekt Instanz deren close()
Verfahren zuzuordnen ist aufgerufen, wie es out-of-scope geht.Verwendet Try-mit-Ressourcen ohne eine neue Objektinstanz schlechte Form?
Soweit ich feststellen kann, ist das Erstellen eines neuen Objekts keine Voraussetzung, und die Try-with-Resources-Syntax benötigt nur eine lokale Variable, um close() aufzurufen, wenn diese außerhalb des Bereichs liegt. Daher können Sie damit "gepaarte Operationen" steuern, wie z. B. das Zuweisen von Daten aus einem Pool und die Rückgabe.
Zum Beispiel myHandle unten zeigt, wie eine gepoolte Instanz freizugeben, wenn Sie nicht mehr benötigen:
// init
class MyHandle implements AutoCloseable {
boolean inUse = false;
public MyHandle allocate() {
inUse = true;
return this;
}
public void close() {
inUse = false;
}
}
MyHandle[] pool = new MyHandle[POOL_SIZE];
for (int i = 0; i < pool.length; i++) {
pool[i] = new MyHandle(i);
}
// allocate
MyHandle allocateFromPool() {
for (int i = 0; i < pool.length; i++) {
if (!pool[i].inUse)
return pool[i].allocate();
}
throw new Exception("pool depleted");
}
// using resources from the pool
try (MyHandle handle = allocateFromPool()) {
// do something
}
// at this point, inUse==false for that handle...
Sind die schlechte Form in Betracht gezogen?
EDIT: Ich denke, ich frage, ob es bessere Alternativen zum Aufbau dieser Art von Logik gibt, oder ob es einen großen Nachteil gibt, wenn man mit dem obigen Ansatz geht. Ich finde, dass die Verwendung dieses in einer Bibliothek für eine saubere API sorgt.
EDIT 2: Bitte ignorieren Sie Probleme im Codebeispiel, ich schrieb es inline in der SO Textfeld, um meine Frage mit einer Art von Beispiel zu verdeutlichen. Offensichtlich ist es kein echter Code! :)
Es ist in Ordnung - das ist auch so, wenn man einen Verbindungspool benutzt: 'try (Verbindung c = pool_oder_datasource.getConnection()) {}' ... – assylias