문제

일부 C#에서 "사용"조항에 대한 질문을 보았습니다. Java에는 동등한 것이 있습니까?

도움이 되었습니까?

해결책

예. Java 1.7이 소개되었습니다 재료를 시도하십시오 쓸 수있는 구성을 구성합니다.

try(InputStream is1 = new FileInputStream("/tmp/foo");
    InputStream is2 =  new FileInputStream("/tmp/bar")) {
         /* do stuff with is1 and is2 */
}

... 그냥 a using 성명.

불행히도 Java 1.7 이전에 Java 프로그래머는 Try {...} 최종적으로 {...}를 사용해야했습니다. 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();
}

다른 팁

예, Java 7이므로 다시 작성할 수 있습니다.

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();
}

처럼

try(InputStream is1 = new FileInputStream("/tmp/foo");
    InputStream is2 =  new FileInputStream("/tmp/bar")) {
         /* do stuff with is1 and is2 */
}

try 문에 매개 변수로 전달 된 개체는 구현해야합니다. java.lang.AutoCloseable.Have a look at the 공식 문서.

이전 버전의 Java 체크 아웃 용 이 답변 그리고 이 답변.

언어 내에서 가장 가까운 동등한 점은 시험을 피하는 것입니다.

using (InputStream in as FileInputStream("myfile")) {
    ... use in ...
}

becomes

final InputStream in = FileInputStream("myfile");
try {
    ... use in ...
} finally {
    in.close();
}

일반적인 형태는 항상 다음과 같습니다.

acquire;
try {
    use;
} finally {
    release;
}

획득이 시도 블록 내에있는 경우 획득이 실패한 경우 릴리스됩니다. 경우에 따라 불필요한 코드 (일반적으로 위의 예에서는 NULL을 테스트 함)로 해킹 할 수 있지만, 재입국의 나쁜 일이 발생할 수 있습니다.

똑같은 일을 자주하는 경우 "Execute Around"관용구를 사용할 수 있습니다. 불행히도 Java의 구문은 장점이므로 Bolier 플레이트가 많이 있습니다.

fileInput("myfile", new FileInput<Void>() {
   public Void read(InputStream in) throws IOException {
       ... use in ...
       return null;
   }
});

어디

public static <T> T fileInput(FileInput<T> handler) throws IOException {
    final InputStream in = FileInputStream("myfile");
    try {
        handler.read(in);
    } finally {
        in.close();
    }
}

예를 들어, 더 복잡한 예는 예외를 랩핑합니다.

내가 알고있는 것은 아닙니다. 당신은 시도로 다소 시뮬레이션 할 수 있습니다 ... 마침내 블록 블록이지만 여전히 동일하지 않습니다.

Java에서 가장 가까운 것은 시도/마침내입니다. 또한 Java는 암시 적 일회용 유형을 제공하지 않습니다.

C#: 사용 블록 외부에서 변수를 범위

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 : 변수를 블록 외부로 범위로 범위

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#: 블록 내부의 변수를 범위로 범합니다

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 : 블록 내부의 변수를 범위로 묶습니다

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) {}
    }

}

오랜 시간이 지났지 만 Java 7과 함께 시도-자원 문서를 시도하십시오 함께 추가되었습니다 자동 청구 가능 상호 작용.

익명의 내부 수업을 구현하여 "사용"블록과 비슷한 것을 달성 할 수 있다고 생각합니다. Spring은 "Dao Templates"와 마찬가지로합니다.

글쎄, 사용은 어쨌든 구문 설탕 이었으므로 Java Fellows는 땀을 흘리지 마십시오.

Java에서 BGGA 폐쇄를 받으면 Java에서도 비슷한 구조물에도 열릴 것입니다. Gafter는 예를 들어 슬라이드 에이 예제를 사용했습니다.

withLock(lock) { //closure }

첫 번째 예제에 대부분의 프로그래머가 사용하는 실제 관용구는 다음과 같습니다.

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();
    }
}

이 관용구를 사용하여 들여 쓰기가 적으며, 이는 정리 할 자원이 2 개이 넘는 경우 더욱 중요해집니다.

또한 새로운 FileStream ()의 예외가 필요하면 예외를 던질 수있는 구조에 캐치 절을 추가 할 수 있습니다. 첫 번째 예에서는이 작업을 원한다면 또 다른 동요 시도/캐치 블록이 있어야합니다.

아니요.

당신은 할 수 있습니다

public void func(){

  {
    ArrayList l  =  new ArrayList();
  }
  System.out.println("Hello");

}

이는 사용 절의 제한된 범위를 제공하지만 결승 코드를 호출 할 수있는 idisposable 인터페이스는 없습니다. try {} catch () {} 최종적으로 {}를 사용할 수 있지만 사용의 설탕이 없습니다. 우연히 Java에서 최종화기를 사용하는 것은 일반적으로 나쁜 생각입니다.

아니요, Java에는 사용이 없으며 가장 유사한 기능은 "가져 오기"키워드입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top