gpt4 book ai didi

scala - Scala 中如何处理 POJO/JavaBean 模式?

转载 作者:行者123 更新时间:2023-12-03 14:35:27 25 4
gpt4 key购买 nike

就像问题一样。 scala 是否以与 Java 相同的方式推广它?或者它已经进化为更符合 Scala 的习惯?或者它已经变得无关紧要了?

POJOs 和 JavaBeans 的含义:

  • 不带参数的构造函数
  • 属性是私有(private)的,getter 和 setter 是公共(public)的
  • getter 和 setter 定义属性,隐藏属性


  • 另外,Scala 是否对使用旧的 public 有意见(抱歉,我不喜欢使用这个术语) , private , protected与此问题相关的属性设计?

    最佳答案

    Scala 也有类似 POJO 的习语,但它们与 JavaBeans 不同,Scala 强调不同的方面。

  • Scala 有不同的命名约定:
    def foo: Foo        //Foo getFoo() in Java
    def foo_=(foo: Foo) //void setFoo(Foo foo) in Java

    这样你总是可以写obj.fooobj.foo = bar即使您决定从 getter/setter 切换到直接字段访问,反之亦然。这称为统一访问原则。
  • 由于 Java 互操作性,@BeanProperty引入注解:
    @BeanProperty var foo: Foo = _

    上面的代码不仅创建了类似 Scala 的 getter/setter,还创建了类似 Java 的方法,因此所有 Java 框架都可以无缝工作。
  • Scala 强制您在变量( var )和值( val )之间做出决定,因此您会发现自己更频繁地使用不可变对象(immutable对象)
  • 我真的更喜欢不可变对象(immutable对象)和构造函数中的初始化,这在 Scala 中变得非常容易:
    class Foo(val age: Int, val name: String)

    甚至(val 默认在 case 类中):
    case class Foo(age: Int, name: String)

    这段代码非常简单。但是,如果需要配合Java框架,还是需要无参数的构造函数和setter:
    public class Foo(var age: Int, var name: String) {

    def this() {
    this(0, "")
    }

    }

    备注 valvar 取代.
  • 与 Java 相比,Scala 中的访问修饰符具有稍好的默认值:
    class Foo(var a: Int, x: Int) {

    var b: Int = _

    private var c: Int = _

    private[this] var d: Int = _

    def twisted = a + b + c + d + x

    }

    变量 ab将变为 private public 的字段getter/setter(字段默认是私有(private)的,方法是公共(public)的)。 cd也是私有(private)变量。但是额外的private[this]使d可以在类内部直接访问,而不是通过私有(private) getter/setter 访问。

    因为x在构造函数旁边的某个地方使用,Scala 也会自动为其创建私有(private)字段。但是没有生成 getter/setter,直接在 twisted 中访问。方法(与 d 相同)。

  • 更新:在评论中,您询问重命名 getter/setter。这是一个更复杂的例子。 Getter/setter 同时基于两个字段计算值:
    class Foo {

    private[this] var first: Char = _
    private[this] var rest: String = _

    def fake = first + rest

    def fake_=(s: String) {
    first = s.head
    rest = s.tail
    }

    }

    内部看起来很复杂,但从外部看,它看起来像是不错的旧房产:
    val foo = new Foo()
    foo.fake = "ABC"
    println(foo.fake)

    就像它是:
    class Foo(var fake: String)

    关于scala - Scala 中如何处理 POJO/JavaBean 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9673233/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com