Ich habe in einigen C# Fragen Verweis auf eine "using" -Klausel gesehen. Hat Java das Äquivalent?Hat Java eine Entsprechung zu der C# "using" -Klausel
Antwort
Ja. 1.7 Java eingeführt, um die try-with-resources Konstrukt Sie zu schreiben erlaubt:
try(InputStream is1 = new FileInputStream("/tmp/foo");
InputStream is2 = new FileInputStream("/tmp/bar")) {
/* do stuff with is1 and is2 */
}
... wie ein using
Aussage.
Leider waren Java-Programmierer vor Java 1.7 gezwungen, try {...} finally {...} zu verwenden. In Java 1.6:
InputStream is1 = new FileInputStream("/tmp/foo");
try{
InputStream is2 = new FileInputStream("/tmp/bar");
try{
/* do stuff with is1 and is 2 */
} finally {
is2.close();
}
} finally {
is1.close();
}
Ist es möglich, diese Antwort mit einem Beispiel von C# mit seinem using Block zu aktualisieren, dann Java mit einem try-finally? Vorzugsweise ein Beispiel, das zwei separate Ressourcen verwendet, so dass wir dokumentieren können, wie sichergestellt wird, dass alles ordnungsgemäß geschlossen wird. –
Als Java-Typ ist der obige Vergleich nur ein bisschen schmerzhaft. –
Obwohl technisch korrekt, ist dieses try/finally-Muster nicht das beste. Verwenden Sie: X x = neues X(); versuch {/ * work * /} endlich {x.entsorgen(); } – McDowell
Nicht, dass ich bewusst bin. Sie können etwas mit einem Versuch simulieren ... endlich blockieren, aber es ist immer noch nicht ganz dasselbe.
Nein, es gibt keine Verwendung in Java, die ähnlichste Funktionalität ist das Schlüsselwort "import".
Das ursprüngliche Plakat bezog sich nicht auf enthält. Siehe http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx – McDowell
Poor @shifoz! Ihr seid grausam. Die Frage war völlig vage und er könnte das gemeint haben http://msdn.microsoft.com/en-us/library/sf0df423 (VS.80) .aspx ... Shifoz, Sie können einige Punkte wiederherstellen, indem Sie etwas fragen Programmierer mögen "was ist Ihre Lieblings-Programmierfarbe in RGB?" –
Nein, gibt es nicht.
Sie können
public void func(){
{
ArrayList l = new ArrayList();
}
System.out.println("Hello");
}
Dies gibt Ihnen den begrenzten Umfang der using-Klausel, aber es gibt keinen IDisposable-Schnittstelle Finalisierungscode zu nennen. Sie können versuchen {} catch() {} Endlich {}, aber es hat nicht den Zucker zu verwenden. Übrigens ist die Verwendung von Finalizern in Java generell eine schlechte Idee.
Ich denke, Sie können etwas erreichen, das dem "using" -Block ähnelt und eine anonyme innere Klasse implementiert. Wie Spring mit den "Dao Templates".
Das nächste, was Sie in Java bekommen können, ist versuchen/endlich. Außerdem bietet Java keinen impliziten Disposable-Typ.
C#: Scoping die Variable außerhalb eines unter Verwendung von Block
public class X : System.IDisposable {
public void Dispose() {
System.Console.WriteLine("dispose");
}
private static void Demo() {
X x = new X();
using(x) {
int i = 1;
i = i/0;
}
}
public static void Main(System.String[] args) {
try {
Demo();
} catch (System.DivideByZeroException) {}
}
}
Java: Scoping die Variable außerhalb eines Blocks
public class X {
public void dispose() {
System.out.println("dispose");
}
private static void demo() {
X x = new X();
try {
int i = 1/0;
} finally {
x.dispose();
}
}
public static void main(String[] args) {
try {
demo();
} catch(ArithmeticException e) {}
}
}
C#: Scoping die Variable innerhalb eines Blocks
public class X : System.IDisposable {
public void Dispose() {
System.Console.WriteLine("dispose");
}
private static void Demo() {
using(X x = new X()) {
int i = 1;
i = i/0;
}
}
public static void Main(System.String[] args) {
try {
Demo();
} catch (System.DivideByZeroException) {}
}
}
Java: Scoping die Variable innerhalb eines Blocks
public class X {
public void dispose() {
System.out.println("dispose");
}
private static void demo() {
{
X x = new X();
try {
int i = 1/0;
} finally {
x.dispose();
}
}
}
public static void main(String[] args) {
try {
demo();
} catch(ArithmeticException e) {}
}
}
Nun, unter Verwendung war syntaktischer Zucker sowieso so Java Fellows, nicht schwitzen sie.
Das nächste Äquivalent in der Sprache ist try-finally.
using (InputStream in as FileInputStream("myfile")) {
... use in ...
}
wird
final InputStream in = FileInputStream("myfile");
try {
... use in ...
} finally {
in.close();
}
Beachten Sie die allgemeine Form ist immer:
acquire;
try {
use;
} finally {
release;
}
Wenn Erwerb innerhalb des Try-Block ist, können Sie in dem Fall freigeben wird, dass der Erwerb fehlschlägt. In einigen Fällen können Sie möglicherweise mit unnötigem Code herumhacken (normalerweise im obigen Beispiel auf Null testen), aber im Fall von, sagen wir, ReentrantLock werden schlimme Dinge passieren.
Wenn Sie häufig dasselbe tun, können Sie das Idiom "execute around" verwenden. Leider ist die Syntax von Java sehr ausführlich, es gibt also eine Menge bolerier Platte.
fileInput("myfile", new FileInput<Void>() {
public Void read(InputStream in) throws IOException {
... use in ...
return null;
}
});
wo
public static <T> T fileInput(FileInput<T> handler) throws IOException {
final InputStream in = FileInputStream("myfile");
try {
handler.read(in);
} finally {
in.close();
}
}
Kompliziertere Beispiel meine, zum Beispiel Ausnahmen wickeln.
Wenn wir BGGA-Closures in Java bekommen, würde dies auch für ähnliche Strukturen in Java öffnen. Gafter hat dieses Beispiel in seinen Folien verwendet, zum Beispiel:
withLock(lock) { //closure }
Das eigentliche Idiom von den meisten Programmierern für das erste Beispiel verwendet wird, ist dies:
InputStream is1 = null;
InputStream is2 = null;
try{
is1 = new FileInputStream("/tmp/bar");
is2 = new FileInputStream("/tmp/foo");
/* do stuff with is1 and is 2 */
} finally {
if (is1 != null) {
is1.close();
}
if (is2 != null) {
is2.close();
}
}
Es ist weniger Einrücken dieses Idiom mit, das wird noch wichtiger, wenn Sie mehr als 2 Ressourcen zum Bereinigen haben.
Sie können der Struktur auch eine catch-Klausel hinzufügen, die sich mit der neuen Datei FileStream() befasst, die eine Ausnahme auslöst, wenn Sie sie benötigen. Im ersten Beispiel müssten Sie einen anderen umschließenden try/catch-Block haben, wenn Sie dies tun wollten.
Dieser Code kann Is2 nicht schließen, wenn der Aufruf von is1.close() eine Ausnahme auslöst. Der in der Frage angegebene geschachtelte Code ist vorzuziehen. – cunkel
Es war eine lange Zeit, aber mit Java 7 wurde die try-with-resources statement hinzugefügt, zusammen mit der AutoCloseable Schnittstelle.
Ja, da Java 7 können Sie umschreiben:
InputStream is1 = new FileInputStream("/tmp/foo");
try{
InputStream is2 = new FileInputStream("/tmp/bar");
try{
/* do stuff with is1 and is2 */
} finally {
is2.close();
}
} finally {
is1.close();
}
Als
try(InputStream is1 = new FileInputStream("/tmp/foo");
InputStream is2 = new FileInputStream("/tmp/bar")) {
/* do stuff with is1 and is2 */
}
Die Objekte als Parameter an die try-Anweisung übergeben sollte java.lang.AutoCloseable
.Have einen Blick auf die official docs implementieren.
Für ältere Versionen von Java checkout this answer und this answer.
- 1. Hat Java eine StringStream-Entsprechung?
- 2. Hat C# eine Entsprechung zu #pragma pack in C++?
- 3. Hat .NET eine Entsprechung zu den .properties-Dateien von Java?
- 4. Hat VBScript eine DateTime.TryParse-Entsprechung?
- 5. Hat F # eine Entsprechung zu Haskells Aufnahme?
- 6. Hat Powershell eine Entsprechung zu Popen?
- 7. Hat JPA eine Entsprechung zu Hibernate SQLQuery.addScalar()?
- 8. Hat Mercurial eine Entsprechung zu git clean?
- 9. Hat typescript/javascript ein @ "\" Entsprechung wie C#?
- 10. Hat Delphi eine Entsprechung zur flüchtigen Variablen von C?
- 11. Dappers verschachtelte `using'-Klausel - Klarstellung?
- 12. Hat VB.Net eine Entsprechung zu #pragma warning disable/restore?
- 13. C# Entsprechung von Java PushbackReader ungelesen()
- 14. Hat .gitignore eine Entsprechung für versionsgesteuerte Dateien?
- 15. Hat IntelliJ IDEA eine `Strg` +` K`, `Strg` +` D` Entsprechung?
- 16. Hat jQuery eine Entsprechung zu Element.identify von Prototype?
- 17. Hat GraphicsMagick eine Entsprechung zu ImageMagick 'convert -auto-orient'?
- 18. Hat SQL Server 2005 eine Entsprechung zu MySqls ENUM-Datentyp?
- 19. Sprintf-Entsprechung in Java
- 20. Hat Rust eine Entsprechung zu Pythons unichr() Funktion?
- 21. Hat Django ORM eine Entsprechung zu SQLAlchemy's Hybrid Attribut?
- 22. Hat Oracle eine Entsprechung der Tabellenvariablen von SQL Server?
- 23. C#: Gibt es eine JTable-Entsprechung?
- 24. Gibt es eine Entsprechung von getch() aus C++ in Java?
- 25. Umschreiben der Unterabfrage hat eine Klausel in eine Verknüpfung?
- 26. EXECUTE IMMEDIATE mit USING-Klausel gibt Fehler
- 27. Java-Entsprechung von swfobject
- 28. Führt eine C# using-Anweisung try/finally aus?
- 29. QStackedWidget Entsprechung für Java Swing
- 30. ASP.NET C# Der Wartevorgang hat eine Zeitüberschreitung
mit java 7 hat sich die Antwort von nein zu ja geändert –