java - try with resources 사용




Java에 using 문이 있습니까? (8)

Java에는 최대 절전 모드에서 세션을 열 때 사용할 수있는 using 문이 있습니까?

C #에서는 다음과 같이됩니다.

using (var session = new Session())
{


}

따라서 객체는 범위를 벗어나 자동으로 닫힙니다.



Java 7은이 기능을 Java 플랫폼으로 가져 오는 Automatic Resource Block Management 를 도입했습니다. Java의 이전 버전에는 using 것과 닮은 것이 없었습니다.

예를 들어, 다음과 같은 방법으로 java.lang.AutoCloseable 을 구현하는 모든 변수를 사용할 수 있습니다.

try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
    ...
}

스트림으로 구현 된 Java의 java.io.Closeable 인터페이스는 자동으로 AutoCloseable 확장하므로 C # using 블록에서 사용하는 것과 같은 방식으로 이미 try 블록에서 스트림을 사용할 수 있습니다. 이것은 C #을 using 하는 것과 같습니다.

버전 5.0에서 Hibernate Sessions는 AutoCloseable 구현 하고 ARM 블록에서 자동 닫을 수 있습니다. 이전 버전의 Hibernate에서는 AutoCloseable 구현하지 않았다 . 따라서이 기능을 사용하려면 최대 절전 모드 이상이어야합니다.


기술적으로 :

DisposableObject d = null;
try {
    d = new DisposableObject(); 
}
finally {
    if (d != null) {
        d.Dispose();
    }
}

리소스 관리에 관심이 있다면 Project Lombok@Cleanup 주석을 제공합니다. 자신의 사이트에서 직접 가져온 것 :

@Cleanup 을 사용하면 코드 실행 경로가 현재 범위를 @Cleanup 전에 지정된 리소스가 자동으로 정리되도록 할 수 있습니다. 로컬 변수 선언에 @Cleanup 주석을 사용하여 주석을 추가하면됩니다 (예 :

@Cleanup InputStream in = new FileInputStream("some/file");

결과적으로, 여러분이 속한 범위의 끝에서 in.close() 가 호출됩니다. 이 호출은 try / finally 구조를 통해 실행됩니다. 이것이 어떻게 작동하는지 보려면 아래 예제를보십시오.

정리하려는 객체 유형에 close() 메소드가 없지만 다른 인자가없는 메소드가있는 경우이 메소드의 이름을 다음과 같이 지정할 수 있습니다.

@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);

기본적으로 정리 메소드는 close() 간주됩니다. 인수를 취하는 정리 메소드는 @Cleanup 통해 호출 할 수 없습니다.

바닐라 자바

import java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        out.close();
      }
    } finally {
      in.close();
    }
  }
}

롬복과 함께

import lombok.Cleanup;
import java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    @Cleanup InputStream in = new FileInputStream(args[0]);
    @Cleanup OutputStream out = new FileOutputStream(args[1]);
    byte[] b = new byte[10000];
    while (true) {
      int r = in.read(b);
      if (r == -1) break;
      out.write(b, 0, r);
    }
  }
}

아니요, Java에는 using 이 없습니다.


Java 키워드 목록을 참조하십시오.

  1. using 키워드는 불행히도 목록의 일부가 아닙니다.
  2. 그리고 C #을 using 키워드가 현재 자바와 같은 다른 키워드를 통해 using 되는 것은 아닙니다.

이러한 "using" 동작을 모방하려면 try...catch...finally 블록을 사용해야하며 여기서 finally 리소스를 처리합니다.


지금은 안돼.

그러나 자바 7을위한 ARM 의 제안이있다.


프로젝트 동전의 ARM 블록 은 Java 7에 포함됩니다.이 기능은 .Net using 구문과 유사한 기능을 Java에 제공하기위한 것입니다.







using-statement