scala翻译 java_scala 类和对象(翻译自Programming in Scala)

写一个需求复杂的程序,你必须分解这些需求,把他们变成简单的片段。在Scala语言中,程序分解单元的基础就是class。想要控制复杂性,你可以定义需求可控的类。你可以将这些类实例化成对象,并按照某种方式来组合、协调这些对象,以便解决规模巨大的问题。在设计的过程中,你也可以定义一些接口,通过抽象的方式远离实现的细节。当你和其他的终端程序员使用这些对象的时候,你只需要在抽象的接口方面仔细考虑,并最大限度的忽略那些复杂的实现细节。

3.1类,字段,方法

类是对象的蓝图。一旦你定义了一个类,你就可以通过new关键字来创建这个类的对象。

例如:

class ChecksumAccumulator { // class definition goes here }

你可以创建这个类的实例通过: new ChecksumAccumulator

在类的定义中,能够包含字段和方法,他们统称为类的成员。字段是对象的变量,你可以使用var或者val来定义。字段保持对象的状态或者数据,反之,方法使用这些数据去完成对象的计算工作。当你实例化了一个类,运行时会留出一些内存来保持对象状态的镜像——也就是对象变量的值。 保证一个对象的健壮性的重要方法就是要努力保持在整个生命周期中对象的状态,也就是实例变量的值。第一步就是要使用private来阻止来自对象外部的直接访问,这样一来,就只有类中的方法才能访问这些字段。通过这种方式,将要改变状态的代码会位于类中定义的方法的内部。

注意:在Scala中没有任何修饰符的成员是public的,这种方式是Scala中默认的访问方式。

class ChecksumAccumulator {

private var sum = 0 def add(b: Byte): Unit = { sum += b }

def checksum(): Int = { return ~(sum & 0xFF) + 1 }

}

任何传递给方法的参数都可以在方法中使用。在Scala中方法参数的一个重要特征就是他们是val的而不是var的。参数是val的原因在于val更简单一些。

def add(b: Byte): Unit = { b += 1 // 不能通过编译,因为b是val的。 sum += b }

尽管这一个版本的ChecksumAccumulator类的方法add和checksum能够很好的完成我们想要的功能,但实际上,你或许应该把他们用更简洁的方式表达出来。首先,checksum方法中位于末位的return语句是多余的可以被删掉。在没有任何return语句的情况下,Scala的方法返回方法计算的最后一个值。Scala推荐使用没有明确return的方法风格,特别是在需要很多返回值的时候。你应该考虑每一个方法都应该像表达式一样产生一个能够被返回的值,并用这种方式来替代明确的return语句。这个原则鼓励你通过将一个大方法拆分成小方法的方式来使用尽量小的方法。另一方面,设计的选择总是依赖于设计的上下文(或者其所依赖的环境以及目标),当你需要方法有明确的多重的return语句的时候,Scala也能够轻松做到。方法的另一种简化的方式是,如果方法仅有一行的话,可以去掉大括弧。(注意:这一行应该要有一个值)

class ChecksumAccumulator {

private var sum = 0 def add(b: Byte): Unit = sum += b

def checksum(): Int = ~(sum & 0xFF) + 1

}

返回类型为Unit的方法,执行的时候会有副作用。当一个方法改变了某个外部的状态或者执行了i/o操作,通常会被认为有副作用。例如在add方法被调用的时候,sum会被重新赋值,这就是副作用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值