走进Scala——伴生对象(Companion Object)<转>
2015-01-15 15:14
369 查看
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://www.blogbus.com/dreamhead-logs/60217908.html
准备涉水Scala的Java程序员请注意,Scala里没有static。
在大多数情况下,static真不该是static的。像Scala这样想在面向对象上更进一步的程序设计语言,取消static是一种进取的表现,这样得以保证了其面向对象模型的完整性。好吧,我承认,有时候,我们还是需要类一级的属性和操作的。在Scala里,我们还是有机会的,这便是伴生对象(Companion Object)的作用。
下面就是一个伴生对象的例子:
object Companion {
def show = println("I am a companion")
}
class Companion {
def shout = Companion.show
}
(Companion.scala)
这个object就是我们所说的伴生对象,如果读过《走进Scala——Singleton》,你会觉得这个伴生对象和Singleton异曲同工,实际上,是这样的。伴生对象本身就是一个Singleton,不同的是,它有一个与之同名的类(这里的class Companion),二者可以相互访问彼此的私有成员。在这里,我们暂且不关心私有成员的相互访问。
编译一下:
scalac Companion.scala
同Singleton一样,我们也得到了两个文件:Companion.class和Companion$.class。我们还可以用javap查看反编译的结果,其中,Companion$.class与之前的Singleton$.class几近相同,这里就省略了。一起来看看Companion.class。
javap Companion
public class Companion extends java.lang.Object implements scala.ScalaObject{
public static final void show();
public Companion();
public void shout();
}
因为有了对应的class,object成了伴生对象。从结果可以看出,伴生对象和它对应的类在字节码层面走到了一起(Companion类)。换句话说,在Scala里面的class和object在Java层面里面合二为一,class里面的成员成了实例成员,object成员成了static成员。我们已经知道,这里的static成员只是一个简单的wrapper,封装了实际的操作。
对应到反编译的代码上,我们看到了与object相关的那个static方法——show。因为要构建Companion的实例,所以,生成的代码里有构造函数。此外,class Companion的实例方法shout在字节码层面上也体现到了Companion类里。
至此,我们已经对伴生对象有了一个基本的了解。在Scala的层面上,我们把分属于类和实例分开放置,从代码的组织而言,会更加清晰。在实现层面上,它们都是按照对象处理的(分别用Companion$和Companion),从而达到了对象模型的统一。
最后,我想说,请善用object。
http://www.blogbus.com/dreamhead-logs/60217908.html
准备涉水Scala的Java程序员请注意,Scala里没有static。
在大多数情况下,static真不该是static的。像Scala这样想在面向对象上更进一步的程序设计语言,取消static是一种进取的表现,这样得以保证了其面向对象模型的完整性。好吧,我承认,有时候,我们还是需要类一级的属性和操作的。在Scala里,我们还是有机会的,这便是伴生对象(Companion Object)的作用。
下面就是一个伴生对象的例子:
object Companion {
def show = println("I am a companion")
}
class Companion {
def shout = Companion.show
}
(Companion.scala)
这个object就是我们所说的伴生对象,如果读过《走进Scala——Singleton》,你会觉得这个伴生对象和Singleton异曲同工,实际上,是这样的。伴生对象本身就是一个Singleton,不同的是,它有一个与之同名的类(这里的class Companion),二者可以相互访问彼此的私有成员。在这里,我们暂且不关心私有成员的相互访问。
编译一下:
scalac Companion.scala
同Singleton一样,我们也得到了两个文件:Companion.class和Companion$.class。我们还可以用javap查看反编译的结果,其中,Companion$.class与之前的Singleton$.class几近相同,这里就省略了。一起来看看Companion.class。
javap Companion
public class Companion extends java.lang.Object implements scala.ScalaObject{
public static final void show();
public Companion();
public void shout();
}
因为有了对应的class,object成了伴生对象。从结果可以看出,伴生对象和它对应的类在字节码层面走到了一起(Companion类)。换句话说,在Scala里面的class和object在Java层面里面合二为一,class里面的成员成了实例成员,object成员成了static成员。我们已经知道,这里的static成员只是一个简单的wrapper,封装了实际的操作。
对应到反编译的代码上,我们看到了与object相关的那个static方法——show。因为要构建Companion的实例,所以,生成的代码里有构造函数。此外,class Companion的实例方法shout在字节码层面上也体现到了Companion类里。
至此,我们已经对伴生对象有了一个基本的了解。在Scala的层面上,我们把分属于类和实例分开放置,从代码的组织而言,会更加清晰。在实现层面上,它们都是按照对象处理的(分别用Companion$和Companion),从而达到了对象模型的统一。
最后,我想说,请善用object。
相关文章推荐
- 走进Scala——伴生对象(Companion Object)
- 走进Scala——伴生对象(Companion Object)
- 使用< OBJECT >标记引用对象
- Excel通用导出List<Object>对象到excel文件
- form前台提交List<Object>对象以及后台处理
- MyBatis中对List<Object> 对象List的批处理插入操作
- Intent.putExtra()传递Object对象或者ArrayList<Object>
- 使用< OBJECT >标记引用对象
- 使用Map把sql返回的list<Object>转成需要的实体对象
- scala伴生对象companion object
- List<Object>装的是对象 排序问题
- JS 使用List<Object> 对象中的Object对象的某个属性的临时处理方法
- Gson序列化与反序列化成员变量为Map<String,Object>的类对象
- EBS OAF开发中的Java 实体对象(Entity Object)<三>
- js给<object>视频赋值 延迟加载,解决不能修改的html对象的问题 .
- 两个araryList<object>对象比较
- Android两个Activity之间传递List<Object>对象
- EBS OAF开发中的Java 实体对象(Entity Object)<二>
- Javascript 中出现<object>对象未定义的可能原因及解决办法
- spark之scala学习——11步走进scala<转>