换个姿势理解scala的object、单例、静态

初学scala,看了n多文章,总是搞不明白scala的单例实现原理,既然scala脱胎于java,那么就对照java来看吧

1、定义类
例如有这样一个Java类
class A
{
public int a;
public static int b;
public A(){}
}
那么在scala中可以这么写
class A(){---------scala里的主构造体,相当于是java中的构造方法A()
var a :Int; —相当于是java类里的普通变量a
}
object A{----------object定义的是静态的,相当于是java类里的静态区
var b: Int;----这里相当于是java类里的静态变量b
}

2、生成对象
用java代码
A a1 = new A();
A a2 = new A();
a1 a2 共享变量b,各自有变量a

用scala代码
var a1 = new A();
var a2 = new A();
a1 a2 各自有变量a,但是a1.b方式访问不到变量b,如需访问需要添加用如下方式:
class A{
var a:Int
import A.b------对伴生类A做一点改造
def getB = b----引入静态区里的b以后,在伴生类A代码中可以访问到b(可以用a1.getB,但是不能用a1.b,伴生类A外仍是看不到b)
}

ps:
object A{…},这个语法定义的A是一个对象名,与前面的伴生类A同名而已。这个A是全局唯一,静态的,也就是单例的。
object定义的对象有两种,独立对象(没有定义同名类Standalone Object)和伴生对象(定义了同名类Companion Object)

3、单例实现
用java实现单例,我们需要隐藏构造方法,提供一个公共静态方法返回一个对象
class A
{
public int a;
private A(){}
private A pa = null;
public static A getInstance(){
if(pa == null) {
pa = new A();
}
return pa;
}
}
完了用 A pa = A.getInstance() 获取到类的单例对象pa

那么在scala里可以有这样写:
object A{
var a:Int
}
就这样,好了,可以var a = A获取单例对象(print(a.a)),也可以直接用A当单例对象(print(A.a)),因为这里的A本来就是个对象

或者麻烦一点,可以这样写
class A() private{ ----------private修饰,不要让用户显示创建
var a:Int
}
object A{
import A._
var pa = new A()
}
访问可以这样,var sa = A.pa; println(sa.a),这样看起来更像java的实现方法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值