2016-03-28 22 views
5

Kotlin, nesneler için use işlevini sağlar, ancak kaynakların tam Java eşdeğeriyle eşleşmesi için AutoCloseable (ör. DB tarafından hazırlanmış ifadeler) düşünmeyi unutmuş gibi görünüyorlar. Ben KOTLIN konusunda yeniyim ve ben istiyorumKotlin'in kaynaklarla uğraşmaya çalışmayla ilgili kendi çözümüm

fun countEvents(sc: EventSearchCriteria?): Long { 
    return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) { 
     var rs = it.executeQuery() 
     rs.next() 
     rs.getLong(1) 
    } 
} 

:

inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R { 
    try { 
     return block(closeable); 
    } finally { 
     closeable.close() 
    } 
} 

Sonra bunu bir sonraki şekilde kullanabilirsiniz:

sonraki "ev yapımı" çözüm uyguladık Kendi çözümümde önemli bir şey eksik olup olmadığını bilmek bana bir üretim ortamında sorunlar/kaçaklar verebilir.

+3

onlar Java8 desteği uygulamak için hala olmasıdır dışı-box onlar – voddan

+0

Her zaman olabilir JDK8 sınıflarını desteklemek için de, 'AutoClosable' desteklemeyen nedeni kopyalanan 'use' kaynağını kopyalayın ve 'Kapatılabilir 'seçeneğini' AutoCloseable 'olarak değiştirin (bkz. [ReadWrite.kt: 145-177] (https://github.com/JetBrains/kotlin/blob/8549ec7645ff6db4d5fede2c43034be66683561a/libraries/stdlib/src/ kotlin/io/ReadWrite.kt # L145-L177) – mfulton26

+0

Desen için java 8 kullanmayı düşünün Burada bulabilirsiniz http://stackoverflow.com/a/43269795/2463695 –

cevap

7

Uygulamanız sorunsuz çalışacaktır, ancak standart bir kaynak denemeleri uygulamasından farklıdır.

inline fun <T : AutoCloseable, R> trywr(closeable: T, block: (T) -> R): R { 
    var currentThrowable: java.lang.Throwable? = null 
    try { 
    return block(closeable) 
    } catch (throwable: Throwable) { 
    currentThrowable = throwable as java.lang.Throwable 
    throw throwable 
    } finally { 
    if (currentThrowable != null) { 
     try { 
     closeable.close() 
     } catch (throwable: Throwable) { 
     currentThrowable.addSuppressed(throwable) 
     } 
    } else { 
     closeable.close() 
    } 
    } 
} 

UPDATE: mfulton26 olarak

biz döküm zorunda addSuppressed(Throwable) yöntemini içermiyor onun commentkotlin.Throwable işaret Eğer Java böyle bir şey yapması gerektiğini gibi çalışmak istiyorsanız Kodun çalışması için kotlin.Throwable - java.lang.Throwable.

+1

'addSuppress (Throwable)' yoktur kotlin.Thro yöntemi wable' ve 'java.lang.Throwable' kullanamazsınız Kotlin try-catch nasıl bu kod derleme (' s/throwble/throwable/'dışında)? – mfulton26

+0

@ mfulton26 "Throwable" yerine "İstisna" olması gerektiğine inanıyorum. – Kiskae

+1

@ mfulton26 Teşekkürler, bu iyi bir nokta. Kodu derlemek için güncellendi. – Michael

0

Closable'da tanımlandığı gibi istediğin, use() olduğunu düşünüyorum.

2

Kotlin 1.1, .use tarihinden itibaren bir AutoCloseable uygulaması vardır.

@SinceKotlin("1.1") 
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") 
@kotlin.internal.InlineOnly 
public inline fun <T : AutoCloseable?, R> T.use(block: (T) -> R): R { 
    var exception: Throwable? = null 
    try { 
     return block(this) 
    } catch (e: Throwable) { 
     exception = e 
     throw e 
    } finally { 
     this.closeFinally(exception) 
    } 
} 

source

İlgili konular