Scala: Static - Konstruktor??

Landei

Top Contributor
Alles, was in Java static ist (von statischen imports und statischen inneren Klassen mal abgesehen), kann in Scala über Companion-Objekte ausgedrückt werden.

Java:
public class Caesar {
  
   private String name;
   public Caesar(String name) {
      this.name = name;
   }
   public void say() {
      for(String l : list) {
         System.out.println(l); 
      }
   }
   
   private static List<String> list = new ArrayList<String>();
   static {
      list.add("veni"); 
      list.add("vidi"); 
      list.add("vici"); 
   }
}

... wird also zu ...

Code:
class Caesar(val name:String) {
   def say():Unit = Caesar.list.foreach(println)
}

object Caesar {
   //Analog zu Java
   var list = List[String]()
   list += "veni"
   list += "vidi"
   list += "vici"

   //Oder besser gleich
   //val list = List("veni","vidi","vici")
}
 
Zuletzt bearbeitet:

Siassei

Bekanntes Mitglied
Servus Landei,

ich hätte ein Beispiel geben sollen

Java:
class Abc { 
  static int a;
  static {
    InputStream in = ...
    ....
    a = in.read()
   }
}

In Scala würde das bei mir so aussehen
Java:
object Abc {
  var a

  // call static
  myStaticKonstr

  def myStaticKonstr = {
    ....
  }
}

Die Scala-Lösung gefällt sowie so besser. Ich wollte nur wissen, ob Object einen Konstruktor wie der in Java besitzt?
 

Landei

Top Contributor
Ja, allerdings nur einen parameterlosen Hauptkonstruktor, während Instanzen auch Konstruktor-Parameter und Nebenkonstruktoren wie def this(xy:Z) ... zulassen. Dein myStaticKonstr würde so zwar funktionieren, aber normalerweise schreibt man den Initialisierungscode einfach direkt in das Objekt oder die Klasse.

Auch wenn eine komplizierte Initialisierung nötig ist, braucht man kein var, sondern kann ausnutzen, dass Blocks in Scala einen Wert besitzen:
Code:
object Abc {
  val a = {
    InputStream in = ...
    ....
    in.read()
  }
}

Nützlich ist weiterhin, dass man auch Tupel zuweisen kann:
Code:
val (x,y) = {
      val loc = myFrame.getLocation
      (loc.x, loc.y)  
  }
 

Siassei

Bekanntes Mitglied
Ein bisschen Off-topic, noch eine Konstruktor Frage.

Was nutzt mir die Definition von this in einer Klasse?
Scala:
Java:
def this(a, b, c) = this(a, _, c)
Ist das eine Möglichkeit Standard-Parameter zu setzen, oder steckt da noch mehr dahinter?

Zudem stehe ich noch vor einen kleinen Problem. Ich konvertiere gerade meine BigInteger-Implementation nach Scala (reine Übung ;-) ). Dabei habe ich folgendes
Java:
Java:
public NumericArray(NumericArray n) ....
public NumericArray(int[] mag) ....
public NumericArray(int val) ....
public NumericArray(String s) ...
...

Muss ich das in ein Object auslagern oder kann ich in Scala etwas definieren, dass ich schreiben kann
Scala:
Java:
val big1 = new NumericArray("123")
val big2 = new NumericArray(222)
 

Landei

Top Contributor
Also, zuerst einmal ist Scala anders, weil es zwischen dem Haupt- und Nebenkonstruktoren unterscheidet. Jeder Nebenkonstruktor muss (direkt oder indirekt) den Hauptkonstruktor aufrufen:

Code:
class Bla(a:String, b:String, c:String) {  //<--Hauptkonstruktor
   def this(a:String, b:String) = this(a,b,"cool")
   def this(a:String) = this(a,"ist","cool")
   def this() = this("Scala","ist","cool")
}

Für den Hauptkonstruktor wählt man normalerweise die "allgemeinste" Variante. In Scala 2.8 können viele Nebenkonstruktoren wegfallen, weil jetzt Default-Argumente unterstützt werden:

Code:
//Scala 2.8
class Bla(a:String = "Scala", b:String = "ist", c:String = "cool") { 
}

Für dein NumericArray hast du zwei Möglichkeiten, nämlich die oben gezeigte Haupt/Nebenkonstruktor-Variante, oder du hast nur eine Art, das Objekt zu erzeugen (also nur einen Hauptkonstruktor), bietest aber Factory-Methoden am Begleit-Objekt als "Hilfskonstruktoren" an, was insbesondere dann der bessere Weg ist, wenn keine Vererbung vorgesehen ist. Dabei nutzt man die Sonderstellung von Methoden namens "apply" aus (statt bla.apply(x,y) darf man bla(x,y) schreiben):

Code:
class NumericArray(int[] mag) {
}

object NumericArray { //<--Begleitobjekt, companion object
  def apply(n: NumericArray) = new NumericArray(n.mag)
  def apply(value: Int) = new NumericArray(Array(value))
  def apply(s: String) = new NumericArray(convertSomehowStringToIntArray(s))
}

//Aufrufe
//Hauptkonstruktor
val a = new NumericArray(Array(2,3,4,5))
//Factory-Methoden
val b = NumericArray(13)
val c = NumericArray("134957495749580569")
val d = NumericArray(c)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Unterschied funktionial <-> OO anhand von Scala <-> Java JVM Sprachen: Kotlin, Scala, Groovy, Jython... 5
M Experten für Scala-Play- Programmierung gesucht!! JVM Sprachen: Kotlin, Scala, Groovy, Jython... 3
M Scala-Programm mit Netbeans compilieren JVM Sprachen: Kotlin, Scala, Groovy, Jython... 1
M Suche Scala Entwickler (Umsteiger [JAVA]) für Zusammenarbeit an privatem Projekt JVM Sprachen: Kotlin, Scala, Groovy, Jython... 7
R Frage zu Scala Code JVM Sprachen: Kotlin, Scala, Groovy, Jython... 2
Landei Scala Scala 2.10 RC JVM Sprachen: Kotlin, Scala, Groovy, Jython... 3
schlingel Scala Schulung - Gratis vom Scala-Schöpfer JVM Sprachen: Kotlin, Scala, Groovy, Jython... 2
Landei Scala Scala-Kritik JVM Sprachen: Kotlin, Scala, Groovy, Jython... 151
Spin Scala Eclipse IDE JVM Sprachen: Kotlin, Scala, Groovy, Jython... 7
Spin Funktionen vs Methods in Scala JVM Sprachen: Kotlin, Scala, Groovy, Jython... 9
Landei Scala Freies eBook "Scala for the impatient" JVM Sprachen: Kotlin, Scala, Groovy, Jython... 2
Spin Arithmetik in Scala JVM Sprachen: Kotlin, Scala, Groovy, Jython... 32
0x7F800000 Numerik in Scala (Performance) JVM Sprachen: Kotlin, Scala, Groovy, Jython... 14
Spin Scala MenuListener JVM Sprachen: Kotlin, Scala, Groovy, Jython... 5
Spin Scala in Eclipse will nicht. JVM Sprachen: Kotlin, Scala, Groovy, Jython... 15
Landei Scala Deutsches Scala-Tutorial JVM Sprachen: Kotlin, Scala, Groovy, Jython... 3
B Scala oder Clojure JVM Sprachen: Kotlin, Scala, Groovy, Jython... 6
Landei Scala "Programming in Scala" - erste Ausgabe kostenlos JVM Sprachen: Kotlin, Scala, Groovy, Jython... 1
W Scala *.Scala to *.jar JVM Sprachen: Kotlin, Scala, Groovy, Jython... 6
H Scala und Aspekte JVM Sprachen: Kotlin, Scala, Groovy, Jython... 4
S Scala Klasse.class in Scala? JVM Sprachen: Kotlin, Scala, Groovy, Jython... 4
B Scala Scala und Netbeans GUI Editor JVM Sprachen: Kotlin, Scala, Groovy, Jython... 15
S Scala: Parser und Lexical JVM Sprachen: Kotlin, Scala, Groovy, Jython... 2
D Wie manche ich das in Scala JVM Sprachen: Kotlin, Scala, Groovy, Jython... 12
G Scala IDE JVM Sprachen: Kotlin, Scala, Groovy, Jython... 18
A Scala und J2ME JVM Sprachen: Kotlin, Scala, Groovy, Jython... 2
S Scala Fragen zu Scala JVM Sprachen: Kotlin, Scala, Groovy, Jython... 21
D (Mathe-) Vektoren in Scala JVM Sprachen: Kotlin, Scala, Groovy, Jython... 4
Landei Scala im Kommen :-) JVM Sprachen: Kotlin, Scala, Groovy, Jython... 4

Ähnliche Java Themen

Neue Themen


Oben