Temat pojawił się na warsztatach : Czy jeśli klasa rozszerza AnyVal i się wywali w Runtimime to co dokładnie będzie widać w stacktrace? Czy będzie informacja o tym, ze to była klasa czy też będzie tam widniał typ prymitywny?
Odpowiedź na tak postawione pytanie brzmi "Tak, masz rację, teraz mnie zostaw w spokoju"
Labolatorium
Na początek przygotujmy aparaturę badawczą
class Domenowa(val s:String) extends AnyValĆwiczenie pierwsze - zrobić aby coś się wywaliło. Wrzućmy granat w środek :
val d=new Domenowa(null)
"Exception in thread "main" java.lang.NullPointerException at com.wlodar.nauka.oop.Domenowa$.hashCode$extension"Zaraz zajrzymy pod mikroskop ale najpierw jeszcze jedna wypierdółka :
class Domenowa(val s:String) extends AnyVal{ null.toString }I tu się tego nie spodziewałem :
Error:(18, 10) this statement is not allowed in value class null.toString ^Wygląda na to, ze ValueClasses w ogóle nie mogą mieć konstruktorów.
To jeszcze inaczej :
class Domenowa(val s:String) extends AnyVal{ def logic=null.toString }I się wywaliło :
Exception in thread "main" java.lang.NullPointerException at com.wlodar.nauka.oop.Domenowa$.logic$extension
Pod oscyloskop go
Po kompilacji mamy tka naprawdę dwie klasy. Ta Domenowa$ nie pojawia się gdy nie rozszerzamy AnyVal-rw-rw-r-- 1 pawel pawel 1875 kwi 12 21:22 Domenowa.class -rw-rw-r-- 1 pawel pawel 1170 kwi 12 21:22 Domenowa$.class javap Domenowa public final class com.wlodar.nauka.oop.Domenowa { public static boolean equals$extension(java.lang.String, java.lang.Object); public static int hashCode$extension(java.lang.String); public static java.lang.String logic$extension(java.lang.String); public java.lang.String s(); public java.lang.String logic(); public int hashCode(); public boolean equals(java.lang.Object); public com.wlodar.nauka.oop.Domenowa(java.lang.String); } javap Domenowa$ public final class com.wlodar.nauka.oop.Domenowa$ { public static final com.wlodar.nauka.oop.Domenowa$ MODULE$; public static {}; public final java.lang.String logic$extension(java.lang.String); public final int hashCode$extension(java.lang.String); public final boolean equals$extension(java.lang.String, java.lang.Object); }Strzelam, że kiedy wywoływana jest metoda logic na klasie Domenowej to gdzieś tam pod spodem ten string ze środka jest przekazywany do tego logic$extension(java.lang.String). Jest jedna instancja Domenowa$, ValueClasses nie maja pól to nei ma stanu i to wszystko tak działa (chyba). Postanowiłem zdekompilowac kod z opcja -c by zobaczyć bytecoda
public final java.lang.String logic$extension(java.lang.String); Code: 0: aconst_null 1: invokevirtual #18 // Method java/lang/Object.toString:()Ljava/lang/String; 4: areturnPo czym się zastanowiłem po co właściwie chce go zobaczyć jak i tak się na tym nie znam?
To może jednak prościej
Potwórzmy kilka identycznych klas.class Domenowa(val s:String) extends AnyVal{ def logic=this.toString() } println(new Domenowa("abc")) println(new Domenowa("abc")) println(new Domenowa("abc")) println(new Domenowa("abc")) println(new Domenowa("abc2")) println(new Domenowa("abc2")) println(new Domenowa("abc").logic) println(new Domenowa("abc").logic)
com.wlodar.nauka.oop.Domenowa@17862 com.wlodar.nauka.oop.Domenowa@17862 com.wlodar.nauka.oop.Domenowa@17862 com.wlodar.nauka.oop.Domenowa@17862 com.wlodar.nauka.oop.Domenowa@2d9410 com.wlodar.nauka.oop.Domenowa@2d9410 com.wlodar.nauka.oop.Domenowa@17862 com.wlodar.nauka.oop.Domenowa@17862I cuda. Jak jest ten sam string to i jest ta sama referencja. Jeśli dla eksperymentu usuniemy extends AnyVal to już to nie działa. Czyli tu nie działa przez co udowadniamy , że ogólnie mechanizm jak taki działa.
class Domenowa(val s:String){ def logic=this.toString() } com.wlodar.nauka.oop.Domenowa@48140564 com.wlodar.nauka.oop.Domenowa@58ceff1 com.wlodar.nauka.oop.Domenowa@7c30a502 com.wlodar.nauka.oop.Domenowa@49e4cb85 com.wlodar.nauka.oop.Domenowa@2133c8f8 com.wlodar.nauka.oop.Domenowa@43a25848 com.wlodar.nauka.oop.Domenowa@3ac3fd8b com.wlodar.nauka.oop.Domenowa@5594a1b5wracamy do class Domenowa(val s:String) extends AnyVal{ def logic=this.toString() } Znowu zdekompiluje bytecod Domenowa$ (sam nie wiem po co).
public final java.lang.String logic$extension(java.lang.String); Code: 0: new #16 // class com/wlodar/nauka/oop/Domenowa 3: dup 4: aload_1 5: invokespecial #19 // Method com/wlodar/nauka/oop/Domenowa."i niby tutaj jest instrukcja new, która tworzy klasę domenową. Według dokumentacji to alokuje nową instancję a jednak sprawdzaliśmy, że tak się nie dzieje. Co umacnia mnie w przekonaniu, ze na bytecodzie Javy się nie znam. http://docs.scala-lang.org/overviews/core/value-classes.html":(Ljava/lang/String;)V 8: invokevirtual #23 // Method java/lang/Object.toString:()Ljava/lang/String; 11: areturn
Najbliższe spotkania i warsztaty ze Scalacheck
- Najbliższy czwartek - Scala Ciągłe Scala-owanie czyli Jak żyć z językiem Scala
- 22 Kwietnia załatwiamy salkę na prezentację Sławka Sobótki - "Ścisły przewodnik po aspektach miękkich - część II" - meetup wkrótce
- 23 Kwietnia Janek Pustelnik - Unfiltered guide to Scala
- 28 Kwietnia Piotr Zalewski -Holy Grail for JVM = Grails (Warsztaty. W końcu ktoś robi warsztaty!)
- I w najbliższą sobotę Zdobywca tytułu prelegenta roku 2014 JUG Łódź Michał Baliński robi warsztaty Projektowanie architektury aplikacji dla chmury AWS - tylko to nie jest w ramach JUGa a grupy Tech Café Łódź
- 25 Kwietnia w sobotę - Całodniowe warsztaty ze Scali prowadzone przez Jacka Laskowskiego. Tego spotkania nie ma jeszcze na meetupie bo ogarniamy nową opcję - przedszkole aby mogli przyjść ludzie z dziećmi. Ale to wszystko jest w trakcie.
" żeby się nie zastanawiać za długo to moja propozycja warsztatu: Intro to java8 workshop: agenda: Lambda Expressions Stream API DateTime package W ciągu tygodnia przygotuje repo na githubie i przygotuje krótki opis warsztatu. "
I jeszcze jakoś na początku maja Cezary Draus który też pracuje w Touku (oraz pociągu relacji Łódź-Warszawa) zrobi warsztaty z intellij.
W tym wszystkim jedyny rozsądny termin w jaki mogę się wcisnąć z warsztatami to 20 kwietnia : Scalacheck i Property Based Testing - Warsztaty
Będą trzy iventy w tygodniu ale damy radę.
Brak komentarzy:
Prześlij komentarz