2012-03-12 13 views
13

. Scala, Java ile aynı şekilde destekliyor mu? Ya da Scala için daha idiyotik olmak için evrim geçirdi mi? Yoksa ilgisiz mi yapıldı? anlamNasıl POJO/JavaBean model Scala tedavi edilir? Sadece soru gibi

POJOs ve JavaBeans:

  • nitelikleri Alıcılar ve ayarlayıcılar
  • Alıcılar ve ayarlayıcılar özellikleri tanımlar herkese açıktır, özeldir hiçbir parametre alır

    1. Yapıcı, gizleme

    nitelikleri

    Ayrıca, Scala'nın (üzgünüm, bu terimi kullanmayı sevmediğim) görüşleri vardır. Bu soruyla alakalı public, private, protected öznitelik tasarımları?

  • cevap

    33

    Scala da POJO benzeri deyimlere sahiptir, ancak JavaBeans'dan farklıdır ve Scala farklı yönlere vurgu yapar.

    1. Scala farklı adlandırma kurallarına sahiptir:

      def foo: Foo  //Foo getFoo() in Java 
      def foo_=(foo: Foo) //void setFoo(Foo foo) in Java 
      

      her zaman yazabilirsiniz Bu şekilde obj.foo ve doğrudan saha erişim ve tersi için getters/belirleyiciler geçmeye karar bile obj.foo = bar. Bu üniforma erişim ilkesi denir.

      @BeanProperty var foo: Foo = _ 
      

      sadece yukarıdaki kod getters/setters Scala benzeri oluşturur, ancak Java benzeri de, yani tüm Java çerçeveler sorunsuzca çalışan:

    2. Java birlikte çalışabilirlik, @BeanProperty açıklama tanıtıldı nedeniyle.

    3. Scala kendinizi çok daha sık değişmez nesneler

      kullanarak bulmak, böylece değişkenler (var) ve değerler (val) arasında karar vermeye zorlar
    4. Gerçekten yapılmış olan yapıcı iletmenin nesneleri ve başlatma tercih
    5. Scala çok kolay:

      class Foo(val age: Int, val name: String) 
      

      hatta (varsayılan olarak valcase yılında sınıflar):

      case class Foo(age: Int, name: String) 
      

      Bu kod parçası sadeliği açısından zekice.

      public class Foo(var age: Int, var name: String) { 
      
          def this() { 
           this(0, "") 
          } 
      
      } 
      

      Not valvar yerini: Java çerçeveler ile işbirliği yapmak gerekir, ancak, yine de hayır-argU yapıcısı ve ayarlayıcılar gerekir.Scala

    6. Erişim düzenleyiciler Java ile karşılaştırıldığında biraz daha iyi varsayılan vardır:

      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 
      
      } 
      

      Değişkenler a ve bpublic odaklar/belirleyiciler ile private alanlar haline gelecektir (alanlar varsayılan olarak gizli olduğu, yöntemler halka açıktır). c ve d, özel değişkenlerdir. Ancak ekstra private[this], d'u özel alıcı/ayarlayıcıdan ziyade sınıfta doğrudan erişilebilir hale getirir.

      x, kurucunun yanında bir yerde kullanıldığından, Scala da bunun için otomatik olarak özel bir alan oluşturur. Ancak hiçbir alıcı/belirteç oluşturulmaz, doğrudan twisted yöntemine (d ile aynı) erişilir.

    GÜNCELLEME: Yorumlarda, alıcıları/ayarlayıcıları yeniden adlandırmayı soruyorsunuz. İşte daha karmaşık bir örnek. Alıcılar/ayarlayıcılar aynı anda iki alana dayalı değerini hesaplıyoruz:

    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 
        } 
    
    } 
    

    içeride karmaşık görünüyor ama dışarıdan o eski güzel özelliği benziyor: Eskiden olduğu takdirde gibi

    val foo = new Foo() 
    foo.fake = "ABC" 
    println(foo.fake) 
    

    :

    class Foo(var fake: String) 
    
    +4

    Ve bunu 8 dakikada yazdınız mı? Bu harika! : D – aitchnyu

    +0

    "aProperty" öğesini istediğinizde bu kod nedir, ancak aString: String' özniteliğine dayanmaktadır? – aitchnyu

    +0

    @aitchnyu: Düzenlemeye devam ediyorum ;-). Ayrıca Scala-Java entegrasyonu ile çok çalışıyorum. –