2010-08-23 22 views
6

"Ana" sınıfım için kurucuyu yazıyorum. Yaptığı ilk şey, komut satırı ayrıştırmak için commons-cli kullanmak için bir yöntem çağırmaktır. parseOptions yöntemi yanlış döndürürse, bir hata oluştu ve kurucudan çıkmalıdır. Scala kurucusundan erken dönüş

Aşağıdaki kodu

if (!parseOptions(args)) return 

yazmaya çalıştı ama derleyici bir "Döndürme deyimi dışında yöntem tanımı" olduğunu şikayet ediyor. System.exit(1) arayarak veya boolean tersini (ve if deyimi içinde benim mantık geri kalanının hepsi koyarak Kısa

, bir yapıcı gelen "erken" dönmek için herhangi bir yolu var mı?

Ben var herhalde getiri yan etkileri olabileceğinden parseOptions yöntemi bir IllegalArgumentException atmak ve benim Main nesnede Anlaşılmadıyamadım.

teşekkürler.

+1

Ben edemedi eğer hiçbir yapıcı normalde döndürmesi gerektiğini diğer cevaplarla kabul ederken Örneğini sınıfının değişmezlerini tatmin eden bir duruma sokmak için, neden 'if' kullanmanın niçin olduğunu merak ediyorum. –

+0

Tüm bunlar erken bir dönüşle sonuçlanabilecek bazı koşullara sahip olsaydı, bir "if" kaskatı çok seviyeli derinlerle sonuçlanacağım. – Ralph

+0

Peki? Yapıcınızın mantığı buysa, bu sizin kurucunuzun mantığıdır. Ayrıca, genellikle, yapıcılarınızda çok fazla karmaşık mantığa sahip olmamanız tavsiye edilir. İdeal olarak, örneğin devletin durumunu/değerini oluşturan değerleri "vurgular". –

cevap

11

yapıcı

sayılı dan "erken" dönmek için herhangi bir yolu yoktur Ama senin zaten, kötü tasarım gibi geliyor. parseOptions yöntem yanlış dönerse

bir hata bir istisna olmalıdır yapıcı, normalde döndürmez Bu durumda

oluştu.

+0

Yeniden gözden geçirdikten ve ('IllegalArgumentException' kullanarak bunu uyguladıktan sonra), kötü bir komut satırı ayrıştırmasının bir özel durumu hak ettiğini kabul ediyorum. – Ralph

12

Dont bir erken/prematüre dönüşü yapmaya çalışacağım, bu, kodunuz zor, daha karmaşık hale getirir h anlamak için. Bunun yerine, bir şeylerin yanlış olduğunu göstermek için bir istisna kullanın.

Kurucuda gereksinim kullanabilirsiniz. Bu geri gelmez. Ama görünüşe göre bir istisna atmak onun durumuna daha iyi uyuyor.

As:

class MyTest(
private var myValue: Int){ 

    require(myValue > 0) // Connected to constructor 

} 

defined class MyTest 

scala> val x = new MyTest(10) 
x: MyTest = [email protected] 

scala> val y = new MyTest(-10) 
java.lang.IllegalArgumentException: requirement failed 
     at scala.Predef$.require(Predef.scala:133) 
+3

Bu, _return_ değil. Ama görünüşe göre bir istisna atmak onun durumuna daha iyi uyuyor. –

4

Bir yapıcı her zaman tam olarak tamamlanmalı veya iptal edilmelidir (bir istisna atmalıdır). Başka herhangi bir şey, nesneyi "yarı inşa edilmiş" bırakıyor ve dolayısıyla akıl yürütmek imkansız. senin durumunda, nesne parseOptions başarısız olsa bile geçerliyse

, o zaman durumu değiştirebilir ve devam:

if (parseOptions(args)) { 
    // rest of constructor 
} 
+1

Scala'nın yapıcıdan dönüşü desteklememesi gerçeği 'akıl yürütmek imkansız' anlamına gelmez. Eğer (X) 'i döndürün,' ... 'ile' (! X) {...} ile değiştirin ve istediğiniz kadar aklınıza gelebileceksiniz. –

+0

Huh? 'if' tersine çevirmenin tam olarak önerdiğimi görmediğini görmedin mi? Bir kurucunun bir istisna atarak bitirmesi veya geri alması gerektiğini söylediğim şey. Bir şeyleri geride bırakmaktan geri dönemez. – IttayD

İlgili konular