2016-11-01 2 views
-2

Ich arbeite mit einem Legacy-Code, wo ich sehe bestimmte DB-Transaktion in Try-with-Resources geschlossen Block initiiert. Ich verstehe, dass die DB-Ressource geschlossen wird, sobald der Code im try-Block ausgeführt wird. Kann mir jemand helfen, wie kann ich das autoclosing überfahren oder umgehen? In diesem Fall? Ich arbeite mit dem Legacy-Code und das auch für sehr kurze Zeit, möchte also nicht zu viel Code ändern und Unit-Test-Fehler einleiten.Try-with-Ressource autoclose Probleme

+5

So wollen Sie Fehler im Code einzuführen, indem nicht die Ressourcen zu schließen, die geschlossen werden müssen? Warum? –

+1

Ohne irgendeinen Code und spezifischere Eingabe auf was genau Sie beabsichtigen zu tun/ändern ... können wir nicht helfen. – GhostCat

Antwort

1

Leider können Sie sich nicht hacken, indem Sie die try-with-resources-Kennung null oder eine ähnliche Technik zuweisen: Java lässt Sie das nicht tun.

Das ist eine gute Sache, da es Ihren Quellcode verschmutzen würde, was die Umkehrung der vorübergehenden Änderung schwierig macht.

Glücklicherweise gibt es bessere Möglichkeiten: Wenn Sie in der Lage sind, die Ressourcenklasse leicht zu ändern, könnten Sie immer eine disableClose()-Methode erstellen, die ein Flag setzt, so dass der nachfolgende close()-Aufruf gutartig ist. Wenn Sie die Ressourcenklasse nicht ändern können, leiten Sie eine Klasse daraus ab und erstellen Sie stattdessen eine Instanz davon. Obwohl dies möglicherweise einen Codebausteinkonstruktorcode erforderlich macht, könnte dies ein besserer Ansatz sein, da Sie dann etwas erstellen können, das die Instanzen protokolliert, die nicht ordnungsgemäß geschlossen wurden.

Wenn Sie eine der beiden Methoden anwenden, können Sie diese vorübergehende Änderung ganz einfach entfernen, indem Sie die disableClose()-Methode oder die abgeleitete Klasse entfernen, was Kompilierungsfehler zur Folge hat, die Sie nacheinander beheben können.

Mögliche Implementierung der abgeleiteten Klasse Ansatz:

public class Foo extends YourResource 
{ 
    // ToDo - add constructors here. 

    private boolean disable = false; 

    @Override 
    public void close() 
    { 
     // ToDo - consider maintaining a collection of unclosed instances. 
     if (!disable){ 
      super.close(); 
     } 
    } 

    public void disableClose() 
    { 
     disable = true; 
    }  
}