scala和java的属性签名与方法签名的思考

这个思考在我接触scala时,就已经产生,这是scala与java的一个语言层上的差别:属性签名和方法签名是同一的。

java:属性签名和方法签名分离;

scala:属性签名和方法签名同一。

分离:


class Temp {
public Integer a = 1;

public Integer a(){
return 1;
}
}//允许属性与方法同签名

同一:


class Temp {
val a1 = 1

val a2 = { 1 }

def a3 = { 1 }

def a4() {
1
}

}//属性和方法签名同一,所以要求名字相异,这种方式跟我之前谈到的“特征”不谋而合

对此差别,我是这么认为的:对于每个对象(或类),我们都是在描述其特征,而所有特征在语言层上都可以表现为“属性 = 值(值对象)”。“对象+特征”我们可以理解为“主+谓”,而方法可以理解为“对象能干什么”,明显地“能干什么”是一个谓词,必能成为一个特征,所以val a2 = {1}跟原始方法定义def a4(){1}从意义上是等同的。而且其优点在于同一后,函数式特点便可以加以使用,例如天生的懒加载特性:lazy val a2 = {1},而且“干什么”和“怎么干”很自然分离。

而在一些类属性相同但只是方法不同,而且方法是对象(或类)的特征的情况下,完全可以通过构造函数来同一化,而且更具描述性。


That's all.
[该贴被admin于2012-05-08 06:46修改过]
[该贴被admin于2012-05-08 06:46修改过]

你这个理解角度很独特。触发我进行思考

对象+属性=对象是什么
对象+方法=对象做什么

“是什么”和“做什么”都可以表达为“特征”

“是什么”可以直接作为句柄使用访问,因为它是一个静止的特征;而做什么是一个动态特征,也应该作为句柄直接使用访问。这是Scala比Java的一个进步,反映了大家思想认识上跨过一个门槛。

其实这样的思考还可以影响到接口思维。

接口(Interface)是我们一向认为Java技术的核心,是产生边界的有效技术。可以说,当真正懂得边界思维时,会很自然地优先使用接口,因为接口是对方法的声明

那么在Java中接口这种方式是否存在某种问题?我认为有二:
一、接口声明跟属性声明相异处理。接口是要表达“做什么”(若果用“特征”的思维,则可以理解为“是什么”),是一种声明,跟属性的声明是同一作用,但Java这种方式却把两种声明放在不同地方。

有这么一种情况:对象存在一个public的属性,而我的确想对外声明,在Java中,我们不得不要通过方法再获得这属性,因为接口不能声明属性。而另外地,方法内容硬性绑定的,为了不同的实现却要建立多个类,所以过多的类问题由此诞生。当然,这不是在批评Java,而是提出Java这方式略显累赘,相同的声明意义却要不等价地独立处理。

二、跟抽象类(abstract class)功能出现重叠情况。当然这跟当时的语言设计有关,可以从网上找到她们各自的作用和相异之处,但我觉得那是不够说服力的。任何的接口都可以用抽象类来代替,而他们都是同一作用:对外进行声明(,对内要求实现)。若果当时Java就引入函数式思维来设计,可能就会跟现在scala极为相似。

从语言层面说,边界声明能力scala更切理。毕竟其吸收了函数式的逻辑性,更具学术意味。

当然Java也可以通过Method类和抽象类来实现上面的思想,只是有点重罢了。

说出这两个问题后,scala如何实现Java的原来目的呢?

第一个就是特征思维,这就不多说了;

第二个是去掉Interface。很多人都认为trait是代替Java的Interface,其实我认为这是错误理解的。去掉Interface是因为,方法声明已与属性声明同一,已经没必要存在。而trait只是一种Mixin技术,而非Interface的代替,这两者原理和意义是相异的。

[该贴被SpeedVan于2012-05-07 17:40修改过]

2012-05-07 17:35 "@SpeedVan"的内容
第二个是去掉Interface。很多人都认为trait是代替Java的Interface,其实我认为这是错误理解的 ...

多个接口实际会对产生副作用,产生混乱,这时需要trait。

如果是单个接口,这时是无需trait。因为Scala强调的是方法,first class是funtcion,实际起到了使用接口声明的显式强调作用。

Java和Scala区别实际对行为方法function的显式强调方式不同,Java通过生硬的接口,而FP语言一般没有这么强烈,而是采取语言本身的润物细无声的方式,称为巧妙的显式方式。

这个如同求爱,女人求爱也会显式表达,只是委婉暗示,是暗中显式提示,而男人是直接表白提出来。

在flash脚本语言中:
属性采用get/set的方法来获取或设置属性,公共的get/set方法可以放在接口文件中,真正实现了属性设置和获取方法以及执行逻辑方法的统一。

2012-05-17 23:31 "@abbasky"的内容
在flash脚本语言中:
属性采用get/set的方法来获取或设置属性,公共的get/set方法可以放在接口文件中,真正实现了属性设置和获取方法以及执行逻辑方法的统一。 ...

flash脚本虽然使用函数,但其并不使用函数思维。在函数思维中最不认同的就是set方法。对象参与到逻辑中应该是产生新的对象,而不是改变原有对象。

而且flash中仍然是属性跟方法声明分离(可回顾我主题的叙述),跟过去没什么两样。真正的统一会致使两者都消失,因为已经没有任何差异存在,也就没有存在意义。两者统一后,会以新姿态出现——也许会如我所说的“特征”。

scala改进的不止是统一访问,语言思维已经超越java了,期待scala2.10

2012-05-21 14:52 "@SpeedVan"的内容
而且flash中仍然是属性跟方法声明分离 ...



public final dynamic class Temp
{
var a1 = 1;

var a2 = function() {
return 1;
};

function a4() {
return 1;
}

}

这是一段flash脚本,我有点不明白,和你给出的scala代码有什么不同?