1. Translating Java Classes to Scala Classes

  Example 1:

# a class declaration in Java
public class Book{} # Scala equivalent of a class declaration
class Book

  Example 2:

# a Java class with a Construtor
public class Book{
private final int isbn;
private final String title; public Book(int isbn, String title){
this.isbn = isbn;
this.title = title;
} public int getIsbn(){
return isbn;
} public String getTitle(){
return title;
}
} # Scala equivalent
class Book(val isbn: Int, val title: String)

  Example 3:

# constructor calling superclass in Java
public class NonFiction extends Book{
public NOnFiction(String title){
super(title);
}
} # Scala equivalent
class NonFiction(title: String) extends Book(title)

  Example 4:

# mutable instance variable in Java
public class Book{
private String title = "Beginning Scala"; public String getTitle(){
return title;
} public void setTitle(String t){
title = t;
}
} # Scala equialent
class Book{
var title = "Beginning Scala"
}

  Example 5:

# immutable instance variable in Java
public class Book{
private final int isbn = ; public int getIsbn(){
return isbn;
}
} # Scala equivalent
class Book{
val isbn =
}

  Translating Java imports to Scala imports:

# import in Java
import com.modA.ClassA;
import com.modB.ClassB1;
import com.modB.ClassB2;
import com.modC.*; # import in Scala
import com.modA.ClassA
import com.modB.{ClassB1,ClassB2} // you can stack multiple imports from the same package in braces
import com.modC._ // underscore in Scala imports is equivalent of * in Java imports

  Example 6:

# Java class with multiple constructors
public class Book {
private Integer isbn;
private String title;
public Book(Integer isbn) {
this.isbn = isbn;
}
public Book(Integer isbn, String title) {
this.isbn = isbn;
this.title = title;
}
public Integer getIsbn() {
return isbn;
}
public void setIsbn(Integer isbn) {
this.isbn = isbn;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}} # refactoring
class Book(var isbn: Int, var title: String)

  If you create the Book instance with a construtor that takes a single "title" parameter, you will get an error.

scala> val book = new Book("test")
<console>:: error: not enough arguments for constructor Book: (isbn: Int, title: String)Book.
Unspecified value parameter title.
val book = new Book("test")

  We need an extra constructor for this case.

scala> class Book(var isbn: Int, var title: String){
| def this(title: String) = this(,title)
| }
defined class Book
scala> val book = new Book("test")
book: Book = Book@1ab0286
scala> book.isbn
res2: Int =
scala> book.title
res3: String = test

  You can get and set "isbn" and "title" because of the generated getters and setters that follow the Scala conversion.

2. JavaBeans specification compliant Scala classes

  To have Java-style getters and setters is to annotate the field with scala.beans.BeanProperty. In this way, you can interact with a Java calss or library that accepts only classes that conform to the JavaBean specification.

scala> import scala.beans.BeanProperty
import scala.beans.BeanProperty scala> class Book(@BeanProperty var isbn: Int, @BeanProperty var title: String)
defined class Book

  After compiling Book.scala with scalac command and disassembling it with javap command:

public class Book {
public int isbn();
public void isbn_$eq(int);
public void setIsbn(int);
public java.lang.String title();
public void title_$eq(java.lang.String);
public void setTitle(java.lang.String);
public int getIsbn();
public java.lang.String getTitle();
public Book(int, java.lang.String);
}

  The methods getTitle,setTitle,getIsbn,setIsbn have all been generated because of the @BeanProperty annotation. Note that use the @BeanProperty annotation on your fields, also making sure you declare each field as a var. If you declare your fields a type val, the setter methods won't be generated.

  You can use @BeanProperty annotation on class constructor parameters, even on the fields in a Scala class.

3. Java interfaces and Scala traits

  A java class can't extend a Scala trait that has implemented methods.

# A regular Java interface declaration

public interface Book{
public abstract boolean isBestSeller();
} # Scala equivalent
trait Book{ def isBestSeller: Boolean}

  Note that in scala, if there is no  = assignment, then the methods denoted with a def keyword or the functions denoted with a val keyword are abstract. That means if there's no definition provided with =, then it's automatically abstract.

# a concrete Java method
public String someMethod(int arg1, boolean arg2){return "voila"} # Scala equivalent
def someMethod(arg1: Int, arg2: Boolean) :String = "volia" # an abstract Java method
abstract int doTheMath(int i) # Scala equivalent
def doTheMath(i: Int): Int

  Example: you need to be able to user an add method from a Java application:

# a Scala trait
trait Computation{def add(a: Int, b:Int) = a + b} # a Java application
public class DoTheMath{
public static void main(String[] args){
DoTheMath d = new DoTheMath();
}
}

  Java class DoTheMath cannot implement the trait Computation because Computation is not like a regular Java interface. To be able to use the implemented method add of a Scala trait Computation from Java class DoTheMath, you must wrap the trait Computation in a Scala class.

# Scala class that wraps the trait Computation
class JavaInteroperableComputation extends Computation # accessing the add method of the Scala trait from Java class
public class DoTheMath extends JavaInteroperableComputation{
public static void main(String[] args){
DoTheMath d = new DoTheMath();
d.add(,);
}
}

  Note that wrap you scala traits with implemented behavior in the Scala class for its Java callers.

4. Java static members and Scala objects

# a singleton in Scala
public class Book{
private static Book book;
private Book(){}
public static synchronized Book getInstance(){
if(book == null){
book = new Book();
}
return book;
}
} # Scala equivalent, object can extend interfaces and traits
object Book{}

  The companion object enables storing of static methods and from this, you have full access to the class's members, including private ones. Scala alows you to declare both an object and a class of the same name, placing the static members in the object and the instance members in the class.

# Java class with instance and static methods
public class Book{
public String getCategory(){
return "Non-Fiction";
} public static Book createBook(){
return new Book();
}
} # Scala equivalent
class Book{
def getCategory() = "Non-Fiction"
} object Book{
def createBook() = new Book()
}

5.  Handling Exceptions

# a Scala method that throws an Exceotion
class SomeClass{
def aScalaMethod{ throw new Exception("Exception")}
} # calling a Scala method from a Java class
publc static void main(String[] args){
SomeClass s = new SomeClass();
s.aScalaMethod();
} # the uncaught exception causes the Java method to fail
[error] (run-main) java.lang.Exception: Exception!
java.lang.Exception: Exception!
at SomeClass.aScalaMethod

  For the Java callers of you Scala methods, add the @throws annotation to your Scala methods so they will know which methods can throw exception and what exception they throw.

# annotating Scala method with @throws
class SomeClass{
@throws(classOf[Excepion])
def aScalaMethod{ throw new Exception("Exception")}
}

  If you attempt to call aScalaMethod from a Java class without wrapping it in a try/catch block, or declaring that your Java method throws an exception, the compiler will throw an eeor.

#calling annotated aScalaMethod from Java
SomeClass s = new SomeClass();
try{
s.aScalaMethod();
}catch(Exception e){
System.err.println("Caught the exception");
e.printStackTrace();
}

Beginning Scala study note(9) Scala and Java Interoperability的更多相关文章

  1. Beginning Scala study note(8) Scala Type System

    1. Unified Type System Scala has a unified type system, enclosed by the type Any at the top of the h ...

  2. Beginning Scala study note(6) Scala Collections

    Scala's object-oriented collections support mutable and immutable type hierarchies. Also support fun ...

  3. Beginning Scala study note(3) Object Orientation in Scala

    1. The three principles of OOP are encapsulation(封装性), inheritance(继承性) and polymorphism(多态性). examp ...

  4. Beginning Scala study note(2) Basics of Scala

    1. Variables (1) Three ways to define variables: 1) val refers to define an immutable variable; scal ...

  5. Beginning Scala study note(4) Functional Programming in Scala

    1. Functional programming treats computation as the evaluation of mathematical and avoids state and ...

  6. Beginning Scala study note(1) Geting Started with Scala

    1. Scala is a contraction of "scalable" and "language". It's a fusion of objecte ...

  7. Beginning Scala study note(7) Trait

    A trait provides code reusability in Scala by encapsulating method and state and then offing possibi ...

  8. Beginning Scala study note(5) Pattern Matching

    The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...

  9. Scala 安装 Exception in thread "main" java.lang.VerifyError: Uninitialized object exists on backward branch 96

    windows下载安装完最新版本的Scala(2.12.4)后,终端如下错误 C:\Users\Administrator>scala -versionException in thread & ...

随机推荐

  1. 用Canvas实现动画效果

    1.清除Canvas的内容 clearRect(x,y,width,height)函数用于清除图像中指定矩形区域的内容 <!doctype html> <html> <h ...

  2. centos环境搭建

    1.php -v 与phpinfo();    不符,查看centos是否有自带的php:更改centos环境变量 /etc/profile,source /etc/profile生效: 2.pecl ...

  3. iOS之访问权限以及跳转到系统界面

    iOS开发中有时候有这样的需求:当用户设置不允许访问照片.麦克风和相机等系统权限的时候,这时需要直接跳转到系统的隐私界面进行设置. 判断是否开启权限 前面已经说过,我们需要在用户不允许访问的时候跳转, ...

  4. 使用SqlDataReader和SqlDataAdapter的注意

    1.当SqlDataReader没有关闭之前,数据库连接会一直保持open状态,所以在使用SqlDataReader时,使用完毕应该马上调用SqlDataReader.Close()关闭它. 2.一个 ...

  5. STM32f10xxx 之 GPIO口配置

    背景 配置stm32f103使其完成PWM输出的过程中,在配置GPIO口的时候,按照习惯配置GPIO口的speed为50MHZ,突然就意识到,为什么大部分例程习惯配置为50MHZ,而不是其它值,即有了 ...

  6. synchronized使用说明

    好久没有更新博客了,今天试着用简单的语言把synchronized的使用说清楚. synchronized是什么? synchronized是用来保证在多线程环境下代码同步执行的可重入的互斥锁.所谓互 ...

  7. 功能实现:PLC对LPC的音量控制

    设计方案1: 在PLC上,当使用QDial调节音量时,触发QDial的SIGNAL:ValueChange(),对应SLOT向LPC发送自定义键码0x22; 在LPC上,当接收到0x22键码时,执行操 ...

  8. APP支付报错ALI40247处理方案!

    简直日狗!这里要吐槽支付宝: 1.支付宝文档太复杂,分类虽然详细,但是我找不到app支付 对应服务端的demo 2.提供下载的sdk都是全整合的 用下来都是一条龙服务,还有一些客户端(app)的请求也 ...

  9. js 对数据转换成数据容量单位

    function bytesToSize(value) { alert(value); alert('value'); debugger; if (value === 0) return '0 B'; ...

  10. spring框架学习(三)

    一.Spring自动组件扫描 Spring 提供组件扫描(component scanning)功能.它能从指定的classpath里自动扫描.侦测和实例化具有特定注解的组件. 基本的注解是@Comp ...