Java中的一系列东西,在Scala之后,我们现在将愉快地与它们道别

Java中的一系列东西,在Scala之后,我们现在将愉快地与它们道别,scala,Scala,我想要一个表格,列出Java历史上哪些烦人的东西,以及它被Scala的哪些特性所取代 我必须承认我是Scala的新手,所以我不能贡献太多。但我觉得,这份清单将有助于我和其他人充分欣赏Scala 例如,我们使用关键字“val”,这使得该值在初始化后不可变。在Java中,我们必须键入对象的类型以及关键字final。Scala让我们摆脱了这种痛苦 在Scala中,并发支持显然更好,但我不希望这样。这是一个太大的好特性,不容忽视。我在寻找更精细的细节,即使很小也会有很好的效果 一些领域包括:类型系统、异

我想要一个表格,列出Java历史上哪些烦人的东西,以及它被Scala的哪些特性所取代

我必须承认我是Scala的新手,所以我不能贡献太多。但我觉得,这份清单将有助于我和其他人充分欣赏Scala


例如,我们使用关键字“val”,这使得该值在初始化后不可变。在Java中,我们必须键入对象的类型以及关键字final。Scala让我们摆脱了这种痛苦

在Scala中,并发支持显然更好,但我不希望这样。这是一个太大的好特性,不容忽视。我在寻找更精细的细节,即使很小也会有很好的效果


一些领域包括:类型系统、异常处理、正则表达式、OOPS功能、语法糖等。

我喜欢函数现在是对象,并且原语默认情况下是包装的。编译器智能推断类型的能力也很好。

我不同意关于这个问题的一些假设

Scala在上运行,因此并发支持(在VM级别)不能比Java更好。请注意,这可能是一个更好的模型,但如果actors不能用Java实现,我会感到惊讶

此外,Java也有。

  • 空值在Scala中(大部分)消失了
  • 表达
  • 协变和逆变定义边泛型
  • 中缀运算符/方法(
    a+b
    列表映射f
  • 模式匹配
  • 隐式类型转换
  • 静态已消失(与对象一起)
  • 强大的包支持(嵌套包)
但由于每个功能都有其含义,因此何时使用是设计的一部分:

  • 对于表达式vs-map/flatMap/filter/
  • 模式匹配与多态性
  • 中缀vs方法调用语法
何时使用隐式类型转换和泛型


没有什么是免费的。Scala是一个功能强大的工具,因此你可能会伤害自己。

我喜欢的一件事是能够编写如下内容:

case class Person(name: String, age: Int)
而不是:

class Person {

  private String name;
  private int age;

  public Person(String name, int age) {
    this.name=name;
    this.age=age;
  }

  public String getName() {
      return name;
  }

  public int getAge{
      return age;
  }

  public String toString() { 
      return String.format("Person(%s, %d)", name, age);
  }

  public boolean equals(Object other) {
      if (other == this) 
          return true;
      if (other.getClass() != getClass())
          return false;
      Person p = (Person) other;
      return getName().equals(p.getName()) && getAge().equals(p.getAge());
  }

  public int hashCode() {
      int h = getName().hashCode();
      h = 37 * h + getAge(); //or whatever it is!
      return h;
  }
}

我认为Scala的两个主要特点是:

  • 静态类型推断-这个很酷的语言特性真的可以让你的代码更短,但必须更快
  • 方差注释,即非方差(scala和java中的默认值)、协方差和反方差-另一个允许您在应用程序中创建关联类型而无需编写太多代码的功能
然而,有一件事让我不太满意,那就是隐式转换的存在(它们类似于C++的隐式转换),这听起来像是一个快速的破解,即管道录音


出于您的考虑

Scala有一个强大的多重继承概念:!这离我们的目标还有很长的路要走。它与。

也有一些相似之处。我期待着在2.8中选择命名参数。它们将有助于不可变对象上的自文档化代码,因为您可以在调用构造函数时使用参数名


此外,2.8中案例类上的复制功能将使实现“修改时复制”对象变得很容易,就像Scala中已经存在的不可变集合一样。

这里使用的是Scala 2.8,因此其中一些尚未完全发布

Scala特别有助于删除样板文件:

  • 类型推断
  • 性状/融合蛋白
  • 统一访问原则-没有更多的getter和setter
  • 运算符重载
以及添加功能结构以进一步减小程序的大小:

  • 第一类函数-是的,这意味着闭包:)
  • 为了理解。这些不是环,而是更强大的野兽
  • match/case块-模式匹配,比switch/case强大得多
它还可以很好地解决Java中的一些设计缺陷

  • 清单类以重新捕获因擦除而丢失的信息
  • 单例-比类上的静态方法更面向对象

  • 声明站点差异-不再“在Java中,我们必须键入对象的类型以及关键字final。Scala让我们摆脱了这种痛苦。”如果这是你对痛苦的定义,那么你已经过了一种非常隐蔽的编程生活。不。我没有过一种庇护的生活。。。但是,是的,我的声明确实意味着我忍受了更多的痛苦:)你忘记了获得者!将其设置为
    case类
    ,您还可以在其中获得
    等于
    哈希代码
    toString
    !他没有忘记二传手。默认情况下,
    case类
    只提供
    val
    s。但是,由于Scala的统一访问原则,val是有效的getter