使用scala进行不同样式的对象初始化

使用scala进行不同样式的对象初始化,scala,Scala,当我使用java时,有一些类似于双括号初始化的东西实际上会在运行时进行一些权衡。在scala中,我发现了初始化对象属性的简单方法,如 val button1: Button = new Button button1.setText("START") button1.setPrefWidth(100) 可以重写为 val button2: Button = new Button { setText("PAUSE") setPrefWidth(100) } 这些与性能或其他方面有什么区别吗?区别

当我使用java时,有一些类似于双括号初始化的东西实际上会在运行时进行一些权衡。在scala中,我发现了初始化对象属性的简单方法,如

val button1: Button = new Button
button1.setText("START")
button1.setPrefWidth(100)
可以重写为

val button2: Button = new Button {
setText("PAUSE")
setPrefWidth(100)
}

这些与性能或其他方面有什么区别吗?

区别在于,在第一种情况下,您实例化了一个新的
按钮
对象,并将其属性设置为一些值(text=“START”和width=100)在第二种情况下,创建一个从
按钮继承的匿名类,并在其匿名初始值设定项(或构造函数,不确定-Java的匿名类不能有构造函数)中初始化其属性

第二种情况大致可以这样重写(如果不是匿名类):

当你调用
newmybutton
时,你会得到一个
MyButton
的实例,文本设置为“开始”,prefWidth设置为100

如果你来自java背景,考虑这个类比:

Button button = new Button() {
    //anonymous initializer
    {
        setText("START");
        setPrefWidth(100);
    }
};

我最近读了这篇文章:那么,scala中的初始化对性能有什么影响吗?我的意思是,匿名类的scala实现与java有什么不同吗?我实际上不知道它的性能。我想我会尽快测量,刚刚测试过。在我的笔记本电脑上初始化1000个
Button()
对象大约需要78毫秒。1000个
按钮{}
对象约为397毫秒。每种情况下测量10次。是的,这会影响性能,但拒绝这种类型的初始化并不是那么关键
Button button = new Button() {
    //anonymous initializer
    {
        setText("START");
        setPrefWidth(100);
    }
};