स्काला के केस क्लास और क्लास के बीच क्या अंतर है?


440

मैंने a case classऔर a के बीच अंतर खोजने के लिए Google में खोज की class। हर कोई उल्लेख करता है कि जब आप वर्ग पर पैटर्न मिलान करना चाहते हैं, तो केस क्लास का उपयोग करें। अन्यथा कक्षाओं का उपयोग करें और समान और हैश कोड ओवरराइडिंग जैसे कुछ अतिरिक्त भत्तों का भी उल्लेख करें। लेकिन क्या केवल यही कारण हैं कि किसी को क्लास के बजाय केस क्लास का उपयोग करना चाहिए?

मुझे लगता है कि स्काला में इस सुविधा के लिए कुछ बहुत महत्वपूर्ण कारण होना चाहिए। स्कैला केस कक्षाओं के बारे में अधिक जानने के लिए क्या स्पष्टीकरण है या क्या कोई संसाधन है?

जवाबों:


394

मामले की कक्षाओं को सादे और अपरिवर्तनीय डेटा-होल्डिंग ऑब्जेक्ट के रूप में देखा जा सकता है जो विशेष रूप से उनके निर्माता तर्कों पर निर्भर होना चाहिए

यह कार्यात्मक अवधारणा हमें अनुमति देती है

  • एक कॉम्पैक्ट आरंभीकरण सिंटैक्स का उपयोग करें ( Node(1, Leaf(2), None)))
  • पैटर्न मिलान का उपयोग करके उन्हें विघटित करें
  • समानता तुलनात्मक रूप से परिभाषित है

वंशानुक्रम के संयोजन में, केस कक्षाओं का उपयोग बीजगणितीय डेटाेटिप की नकल करने के लिए किया जाता है ।

यदि कोई वस्तु अंदर की ओर जटिल गणना करती है या अन्य प्रकार के जटिल व्यवहार का प्रदर्शन करती है, तो यह एक सामान्य वर्ग होना चाहिए।


11
@ तीजा: किसी तरह से। ADT हैं थोड़े पैरामीटर वाले एनम, बेहद शक्तिशाली और टाइपसेफ।
डारियो

8
सीलबंद केस कक्षाओं का उपयोग बीजगणितीय डेटाेटिप की नकल करने के लिए किया जाता है। अन्यथा उपवर्गों की संख्या सीमित नहीं है।
थॉमस जंग

6
@Thomas: सही ढंग से बोला गया, सील एब्स्ट्रैक्ट क्लासेस से निकले केस क्लासेस ने बीजीय डेटेट को बंद कर दिया, जबकि ADT अन्यथा खुला है
डारियो

2
@Dario ... और प्रकार अन्यथा खुला है और नहीं और एक ADT है। :-)
थॉमस जंग

1
@ थॉमस: हां, यह केवल एक अस्तित्व है;)
डारियो

165

तकनीकी रूप से, वर्ग और केस क्लास के बीच कोई अंतर नहीं है - भले ही कंपाइलर केस कक्षाओं का उपयोग करते समय कुछ सामान का अनुकूलन करता है। हालांकि, एक विशिष्ट पैटर्न के लिए बॉयलर प्लेट के साथ दूर करने के लिए एक केस क्लास का उपयोग किया जाता है, जो बीजीय डेटा प्रकारों को लागू कर रहा है ।

इस प्रकार के बहुत ही सरल उदाहरण पेड़ हैं। एक बाइनरी ट्री, उदाहरण के लिए, इस तरह से लागू किया जा सकता है:

sealed abstract class Tree
case class Node(left: Tree, right: Tree) extends Tree
case class Leaf[A](value: A) extends Tree
case object EmptyLeaf extends Tree

वह हमें निम्नलिखित कार्य करने में सक्षम बनाता है:

// DSL-like assignment:
val treeA = Node(EmptyLeaf, Leaf(5))
val treeB = Node(Node(Leaf(2), Leaf(3)), Leaf(5))

// On Scala 2.8, modification through cloning:
val treeC = treeA.copy(left = treeB.left)

// Pretty printing:
println("Tree A: "+treeA)
println("Tree B: "+treeB)
println("Tree C: "+treeC)

// Comparison:
println("Tree A == Tree B: %s" format (treeA == treeB).toString)
println("Tree B == Tree C: %s" format (treeB == treeC).toString)

// Pattern matching:
treeA match {
  case Node(EmptyLeaf, right) => println("Can be reduced to "+right)
  case Node(left, EmptyLeaf) => println("Can be reduced to "+left)
  case _ => println(treeA+" cannot be reduced")
}

// Pattern matches can be safely done, because the compiler warns about
// non-exaustive matches:
def checkTree(t: Tree) = t match {
  case Node(EmptyLeaf, Node(left, right)) =>
  // case Node(EmptyLeaf, Leaf(el)) =>
  case Node(Node(left, right), EmptyLeaf) =>
  case Node(Leaf(el), EmptyLeaf) =>
  case Node(Node(l1, r1), Node(l2, r2)) =>
  case Node(Leaf(e1), Leaf(e2)) =>
  case Node(Node(left, right), Leaf(el)) =>
  case Node(Leaf(el), Node(left, right)) =>
  // case Node(EmptyLeaf, EmptyLeaf) =>
  case Leaf(el) =>
  case EmptyLeaf =>
}

ध्यान दें कि पेड़ एक ही सिंटैक्स के साथ निर्माण और विघटन (पैटर्न मैच के माध्यम से) करते हैं, जो कि वास्तव में वे कैसे मुद्रित होते हैं (माइनस स्पेस)।

और उनका उपयोग हैश मैप या सेट के साथ भी किया जा सकता है, क्योंकि उनके पास एक वैध, स्थिर हैशकोड है।


71
  • केस की कक्षाओं का मिलान पैटर्न से किया जा सकता है
  • केस क्लासेस स्वचालित रूप से हैशकोड और बराबरी को परिभाषित करते हैं
  • केस की कक्षाएं स्वचालित रूप से कंस्ट्रक्टर तर्कों के लिए गेटर विधियां परिभाषित करती हैं।

(आपने पहले ही सभी का उल्लेख किया है लेकिन अंतिम एक)।

वे नियमित कक्षाओं के लिए केवल अंतर हैं।


13
जब तक कि "var" को कंस्ट्रक्टर तर्क में निर्दिष्ट नहीं किया जाता है, तब तक केस केस कक्षाओं के लिए सेट नहीं किए जाते हैं।
मिच Blevins

1
@ मिच: सच, मेरा बुरा। अब तय हो गया।
sepp2k

आपने 2 अंतर छोड़ दिए हैं, मेरा उत्तर देखें।
शेल्बी मूर III

@ मिचबैटलिन, नियमित कक्षाओं में हमेशा गेटटर / सेटर पीढ़ी नहीं होती है
शेल्बी मूर III

केस कक्षाएं अनपेक्षित तरीके से परिभाषित होती हैं, इसीलिए उन्हें पैटर्न से मिलान किया जा सकता है।
हैप्पी टॉर्चर

30

किसी ने इस बात का उल्लेख नहीं किया कि केस क्लासेस भी Productइस तरह के हैं और इस तरह से ये तरीके हैं:

def productElement(n: Int): Any
def productArity: Int
def productIterator: Iterator[Any]

जहाँ productArityकक्षा मापदंडों की संख्या productElement(i)देता है, i th पैरामीटर productIteratorदेता है , और उनके माध्यम से पुनरावृत्ति की अनुमति देता है।


2
हालांकि, वे Product1, Product2 आदि के उदाहरण नहीं हैं।
जीन-फिलिप पेलेट

27

किसी ने उल्लेख नहीं किया कि केस क्लासेस के पास valकंस्ट्रक्टर पैरामीटर हैं, फिर भी यह नियमित कक्षाओं के लिए डिफ़ॉल्ट है (जो मुझे लगता है कि स्काला के डिजाइन में एक विसंगति है)। डारियो ऐसे निहित है जहां उन्होंने कहा कि वे " अपरिवर्तनीय " हैं।

ध्यान दें कि आप varकेस क्लासेस के लिए प्रत्येक कंस्ट्रक्टर के तर्क को तैयार करके डिफ़ॉल्ट को ओवरराइड कर सकते हैं । हालाँकि, केस क्लासेस को म्यूट करने से उनके equalsऔर hashCodeतरीके समय के अनुकूल हो जाते हैं। [१]

sepp2k ने पहले ही उल्लेख किया है कि केस कक्षाएं स्वतः उत्पन्न होती हैं equalsऔर hashCodeविधियाँ।

यह भी किसी ने उल्लेख नहीं किया कि केस क्लासेस स्वचालित objectरूप से क्लास के समान नाम के साथ एक साथी बनाते हैं , जिसमें विधियाँ applyऔर unapplyविधियाँ शामिल हैं। applyविधि के साथ prepending बिना उदाहरणों के निर्माण में सक्षम बनाता है newunapplyनिकालने विधि पैटर्न मिलान है कि दूसरों का उल्लेख सक्षम बनाता है।

साथ ही कंपाइलर केस क्लास [2] के लिए match- caseपैटर्न मैचिंग की गति का अनुकूलन करता है ।

[१] केस क्लासेस कूल हैं

[२] केस क्लासेस और एक्सट्रैक्टर्स, पृष्ठ १५


12

स्काला में केस क्लास निर्माण को कुछ बॉयलरप्लेट को हटाने की सुविधा के रूप में भी देखा जा सकता है।

केस क्लास बनाते समय स्काला आपको निम्नलिखित देता है।

  • यह एक वर्ग के साथ-साथ उसके साथी ऑब्जेक्ट का निर्माण करता है
  • इसका साथी ऑब्जेक्ट उस applyविधि को लागू करता है जिसे आप फ़ैक्टरी विधि के रूप में उपयोग करने में सक्षम हैं। आपको नए कीवर्ड का उपयोग न करने के लिए सिंटैक्टिक शुगर का लाभ मिलता है।

क्योंकि वर्ग अपरिवर्तनीय है, आपको एक्सेसर्स मिलते हैं, जो कि कक्षा के केवल चर (या गुण) हैं लेकिन कोई म्यूटेटर (इसलिए चर बदलने की क्षमता नहीं है)। कंस्ट्रक्टर पैरामीटर सार्वजनिक रूप से केवल फ़ील्ड पढ़ने के लिए स्वचालित रूप से आपके लिए उपलब्ध हैं। जावा बीन निर्माण की तुलना में बहुत अच्छा है।

  • तुम भी मिल hashCode, equalsऔर toStringडिफ़ॉल्ट रूप से तरीके और equalsविधि एक वस्तु संरचना की दृष्टि से तुलना करती है। एक copyविधि एक वस्तु को क्लोन करने में सक्षम होने के लिए उत्पन्न होती है (कुछ क्षेत्रों में विधि को प्रदान किए गए नए मान)।

जैसा कि पहले उल्लेख किया गया है सबसे बड़ा लाभ यह है कि आप केस कक्षाओं पर मैच पैटर्न कर सकते हैं। इसका कारण यह है क्योंकि आपको वह unapplyविधि मिलती है जो आपको केस क्लास को निकालने के लिए उसके क्षेत्र को निकालने की अनुमति देती है।


संक्षेप में एक केस क्लास (या कोई केस ऑब्जेक्ट अगर आपकी क्लास कोई तर्क नहीं लेती है) बनाते समय आपको स्काला से क्या मिल रहा है, एक सिंगलटन ऑब्जेक्ट है जो उद्देश्य को फैक्ट्री के रूप में और एक्सट्रैक्टर के रूप में कार्य करता है ।


आपको किसी अपरिवर्तनीय वस्तु की प्रतिलिपि की आवश्यकता क्यों होगी?
पाओलो एबरमन

@ Pa @loEbermann क्योंकि copyविधि क्षेत्रों को संशोधित कर सकती है:val x = y.copy(foo="newValue")
थिलो

8

इसके अलावा लोग पहले से ही क्या कहा है से, वहाँ के बीच कुछ और बुनियादी मतभेद हैं classऔरcase class

1. Case Classस्पष्ट की जरूरत नहीं है new, जबकि वर्ग के साथ बुलाया जाना चाहिएnew

val classInst = new MyClass(...)  // For classes
val classInst = MyClass(..)       // For case class

2. बाय डिफॉल्ट कंस्ट्रक्टर के पैरामीटर निजी होते हैं class, जबकि इसके पब्लिक इन होते हैंcase class

// For class
class MyClass(x:Int) { }
val classInst = new MyClass(10)

classInst.x   // FAILURE : can't access

// For caseClass
case class MyClass(x:Int) { }
val classInst = MyClass(10)

classInst.x   // SUCCESS

3. case classखुद की तुलना मूल्य से करें

// case Class
class MyClass(x:Int) { }

val classInst = new MyClass(10)
val classInst2 = new MyClass(10)

classInst == classInst2 // FALSE

// For Case Class
case class MyClass(x:Int) { }

val classInst = MyClass(10)
val classInst2 = MyClass(10)

classInst == classInst2 // TRUE

6

स्काला के दस्तावेज के अनुसार :

केस की कक्षाएं केवल नियमित कक्षाएं हैं जो हैं:

  • डिफ़ॉल्ट रूप से अपरिवर्तनीय
  • पैटर्न मिलान के माध्यम से डीकमूलेशन
  • संदर्भ के बजाय संरचनात्मक समानता की तुलना में
  • त्वरित और पर संचालित करने के लिए उपयुक्त है

केस कीवर्ड की एक अन्य विशेषता यह है कि कंपाइलर हमारे लिए कई तरीकों को स्वचालित रूप से उत्पन्न करता है, जिसमें जावा में परिचित स्ट्रींग, बराबर और हैशकोड विधियाँ शामिल हैं।


5

वर्ग:

scala> class Animal(name:String)
defined class Animal

scala> val an1 = new Animal("Padddington")
an1: Animal = Animal@748860cc

scala> an1.name
<console>:14: error: value name is not a member of Animal
       an1.name
           ^

लेकिन अगर हम समान कोड का उपयोग करते हैं लेकिन केस क्लास का उपयोग करते हैं:

scala> case class Animal(name:String)
defined class Animal

scala> val an2 = new Animal("Paddington")
an2: Animal = Animal(Paddington)

scala> an2.name
res12: String = Paddington


scala> an2 == Animal("fred")
res14: Boolean = false

scala> an2 == Animal("Paddington")
res15: Boolean = true

व्यक्ति वर्ग:

scala> case class Person(first:String,last:String,age:Int)
defined class Person

scala> val harry = new Person("Harry","Potter",30)
harry: Person = Person(Harry,Potter,30)

scala> harry
res16: Person = Person(Harry,Potter,30)
scala> harry.first = "Saily"
<console>:14: error: reassignment to val
       harry.first = "Saily"
                   ^
scala>val saily =  harry.copy(first="Saily")
res17: Person = Person(Saily,Potter,30)

scala> harry.copy(age = harry.age+1)
res18: Person = Person(Harry,Potter,31)

पैटर्न मिलान:

scala> harry match {
     | case Person("Harry",_,age) => println(age)
     | case _ => println("no match")
     | }
30

scala> res17 match {
     | case Person("Harry",_,age) => println(age)
     | case _ => println("no match")
     | }
no match

ऑब्जेक्ट: सिंगलटन:

scala> case class Person(first :String,last:String,age:Int)
defined class Person

scala> object Fred extends Person("Fred","Jones",22)
defined object Fred

5

केस क्लास क्या है, इसकी अंतिम समझ के लिए:

चलो मान लेते हैं कि निम्नलिखित मामले की कक्षा परिभाषा:

case class Foo(foo:String, bar: Int)

और फिर टर्मिनल में निम्न कार्य करें:

$ scalac -print src/main/scala/Foo.scala

स्केल 2.12.8 आउटपुट होगा:

...
case class Foo extends Object with Product with Serializable {

  <caseaccessor> <paramaccessor> private[this] val foo: String = _;

  <stable> <caseaccessor> <accessor> <paramaccessor> def foo(): String = Foo.this.foo;

  <caseaccessor> <paramaccessor> private[this] val bar: Int = _;

  <stable> <caseaccessor> <accessor> <paramaccessor> def bar(): Int = Foo.this.bar;

  <synthetic> def copy(foo: String, bar: Int): Foo = new Foo(foo, bar);

  <synthetic> def copy$default$1(): String = Foo.this.foo();

  <synthetic> def copy$default$2(): Int = Foo.this.bar();

  override <synthetic> def productPrefix(): String = "Foo";

  <synthetic> def productArity(): Int = 2;

  <synthetic> def productElement(x$1: Int): Object = {
    case <synthetic> val x1: Int = x$1;
        (x1: Int) match {
            case 0 => Foo.this.foo()
            case 1 => scala.Int.box(Foo.this.bar())
            case _ => throw new IndexOutOfBoundsException(scala.Int.box(x$1).toString())
        }
  };

  override <synthetic> def productIterator(): Iterator = scala.runtime.ScalaRunTime.typedProductIterator(Foo.this);

  <synthetic> def canEqual(x$1: Object): Boolean = x$1.$isInstanceOf[Foo]();

  override <synthetic> def hashCode(): Int = {
     <synthetic> var acc: Int = -889275714;
     acc = scala.runtime.Statics.mix(acc, scala.runtime.Statics.anyHash(Foo.this.foo()));
     acc = scala.runtime.Statics.mix(acc, Foo.this.bar());
     scala.runtime.Statics.finalizeHash(acc, 2)
  };

  override <synthetic> def toString(): String = scala.runtime.ScalaRunTime._toString(Foo.this);

  override <synthetic> def equals(x$1: Object): Boolean = Foo.this.eq(x$1).||({
      case <synthetic> val x1: Object = x$1;
        case5(){
          if (x1.$isInstanceOf[Foo]())
            matchEnd4(true)
          else
            case6()
        };
        case6(){
          matchEnd4(false)
        };
        matchEnd4(x: Boolean){
          x
        }
    }.&&({
      <synthetic> val Foo$1: Foo = x$1.$asInstanceOf[Foo]();
      Foo.this.foo().==(Foo$1.foo()).&&(Foo.this.bar().==(Foo$1.bar())).&&(Foo$1.canEqual(Foo.this))
  }));

  def <init>(foo: String, bar: Int): Foo = {
    Foo.this.foo = foo;
    Foo.this.bar = bar;
    Foo.super.<init>();
    Foo.super./*Product*/$init$();
    ()
  }
};

<synthetic> object Foo extends scala.runtime.AbstractFunction2 with Serializable {

  final override <synthetic> def toString(): String = "Foo";

  case <synthetic> def apply(foo: String, bar: Int): Foo = new Foo(foo, bar);

  case <synthetic> def unapply(x$0: Foo): Option =
     if (x$0.==(null))
        scala.None
     else
        new Some(new Tuple2(x$0.foo(), scala.Int.box(x$0.bar())));

  <synthetic> private def readResolve(): Object = Foo;

  case <synthetic> <bridge> <artifact> def apply(v1: Object, v2: Object): Object = Foo.this.apply(v1.$asInstanceOf[String](), scala.Int.unbox(v2));

  def <init>(): Foo.type = {
    Foo.super.<init>();
    ()
  }
}
...

जैसा कि हम देख सकते हैं कि स्काला संकलक एक नियमित वर्ग Fooऔर साथी-वस्तु का उत्पादन करता है Foo

संकलित वर्ग के माध्यम से चलते हैं और हमें जो मिला है उस पर टिप्पणी करते हैं:

  • Fooकक्षा की आंतरिक स्थिति , अपरिवर्तनीय:
val foo: String
val bar: Int
  • टिककर खेल:
def foo(): String
def bar(): Int
  • कॉपी तरीके:
def copy(foo: String, bar: Int): Foo
def copy$default$1(): String
def copy$default$2(): Int
  • कार्यान्वयन scala.Productविशेषता:
override def productPrefix(): String
def productArity(): Int
def productElement(x$1: Int): Object
override def productIterator(): Iterator
  • scala.Equalsसमानता के लिए तुलनीय केस केस इंस्टेंस बनाने के लिए विशेषता लागू करना ==:
def canEqual(x$1: Object): Boolean
override def equals(x$1: Object): Boolean
  • java.lang.Object.hashCodeबराबर-हैशकोड अनुबंध का पालन करने के लिए ओवरराइडिंग :
override <synthetic> def hashCode(): Int
  • ओवरराइडिंग java.lang.Object.toString:
override def toString(): String
  • newकीवर्ड द्वारा तात्कालिकता के लिए निर्माता :
def <init>(foo: String, bar: Int): Foo 

ऑब्जेक्ट फू: - कीवर्ड के applyबिना तात्कालिकता के लिए विधि new:

case <synthetic> def apply(foo: String, bar: Int): Foo = new Foo(foo, bar);
  • unupplyपैटर्न मिलान में केस क्लास फू का उपयोग करने के लिए चिमटा विधि :
case <synthetic> def unapply(x$0: Foo): Option
  • ऑब्जेक्ट को एकल उदाहरण से उत्पन्न नहीं होने देने के लिए वस्तु को एकलकरण से सिंगलटन के रूप में संरक्षित करने की विधि:
<synthetic> private def readResolve(): Object = Foo;
  • scala.runtime.AbstractFunction2इस तरह की चाल करने के लिए वस्तु फू का विस्तार होता है :
scala> case class Foo(foo:String, bar: Int)
defined class Foo

scala> Foo.tupled
res1: ((String, Int)) => Foo = scala.Function2$$Lambda$224/1935637221@9ab310b

tupled ऑब्जेक्ट से 2 तत्वों के टपल को लागू करके एक नया फू बनाने के लिए एक मजेदार रिटर्न देता है।

इसलिए केस क्लास सिंटैक्टिक शुगर है।


4

कक्षाओं के विपरीत, केस कक्षाएं केवल डेटा रखने के लिए उपयोग की जाती हैं।

डेटा-केंद्रित अनुप्रयोगों के लिए केस क्लासेस लचीले होते हैं, जिसका अर्थ है कि आप केस क्लास में डेटा फ़ील्ड को परिभाषित कर सकते हैं और एक साथी ऑब्जेक्ट में व्यावसायिक तर्क को परिभाषित कर सकते हैं। इस तरह, आप डेटा को बिजनेस लॉजिक से अलग कर रहे हैं।

प्रतिलिपि पद्धति से, आप स्रोत से किसी भी या सभी आवश्यक गुणों को प्राप्त कर सकते हैं और उन्हें अपनी इच्छानुसार बदल सकते हैं।


3

किसी ने भी उल्लेख नहीं किया है कि केस क्लास साथी ऑब्जेक्ट में tupledडिफेंशन है, जिसका एक प्रकार है:

case class Person(name: String, age: Int)
//Person.tupled is def tupled: ((String, Int)) => Person

एकमात्र उपयोग मामला मुझे मिल सकता है जब आपको टपल से केस क्लास बनाने की आवश्यकता होती है, उदाहरण:

val bobAsTuple = ("bob", 14)
val bob = (Person.apply _).tupled(bobAsTuple) //bob: Person = Person(bob,14)

आप बिना किसी बात के, सीधे ऑब्जेक्ट बनाकर, ऐसा कर सकते हैं, लेकिन यदि आपके डेटासेट ने ट्यूल की सूची को एरिटी 20 (20 तत्वों के साथ ट्यूपल) के रूप में व्यक्त किया है, तो हो सकता है कि ट्यूपल का उपयोग करना आपकी पसंद है।


3

एक केस क्लास एक ऐसा क्लास है जिसे match/caseस्टेटमेंट के साथ इस्तेमाल किया जा सकता है ।

def isIdentityFun(term: Term): Boolean = term match {
  case Fun(x, Var(y)) if x == y => true
  case _ => false
}

आप देखते हैं कि caseइसके बाद क्लास फ़न का एक उदाहरण है जिसका दूसरा पैरामीटर एक वार है। यह एक बहुत अच्छा और शक्तिशाली वाक्यविन्यास है, लेकिन यह किसी भी वर्ग के उदाहरणों के साथ काम नहीं कर सकता है, इसलिए केस कक्षाओं के लिए कुछ प्रतिबंध हैं। और अगर इन प्रतिबंधों का पालन किया जाता है, तो हैशकोड और बराबरी को स्वचालित रूप से परिभाषित करना संभव है।

अस्पष्ट वाक्यांश "पैटर्न मिलान के माध्यम से एक पुनरावर्ती अपघटन तंत्र" का अर्थ है "बस इसके साथ काम करता है case"। (वास्तव में, इसके बाद के उदाहरण matchकी तुलना (से मिलान किए जाने वाले) से की जाती है case, जो इस प्रकार है , स्काला को इन दोनों को विघटित करना होगा, और जो इनसे बना है उसका पुनरावर्तन करना होगा।

किस मामले में कक्षाएँ उपयोगी हैं? के बारे में बीजीय डेटा प्रकार विकिपीडिया लेख दो अच्छा शास्त्रीय उदाहरण, सूची और पेड़ों देता है। बीजीय डेटा प्रकारों के लिए समर्थन (यह जानने के लिए कि उनकी तुलना कैसे करें) किसी भी आधुनिक कार्यात्मक भाषा के लिए आवश्यक है।

किस मामले की कक्षाएं उपयोगी नहीं हैं ? कुछ वस्तुओं में राज्य होता है, जैसे कोड connection.setConnectTimeout(connectTimeout)केस कक्षाओं के लिए नहीं है।

और अब आप A Tour of Scala: Case Classes पढ़ सकते हैं


2

मुझे लगता है कि कुल मिलाकर सभी उत्तरों ने कक्षाओं और केस कक्षाओं के बारे में एक अर्थपूर्ण स्पष्टीकरण दिया है। यह बहुत अधिक प्रासंगिक हो सकता है, लेकिन स्केला में हर नौसिखिया को पता होना चाहिए कि जब आप केस क्लास बनाते हैं तो क्या होता है। मैंने यह उत्तर लिखा है , जो केस क्लास को संक्षेप में समझाता है।

प्रत्येक प्रोग्रामर को पता होना चाहिए कि यदि वे किसी भी पूर्व-निर्मित कार्यों का उपयोग कर रहे हैं, तो वे तुलनात्मक रूप से कम कोड लिख रहे हैं, जो उन्हें सबसे अनुकूलित कोड लिखने की शक्ति देकर सक्षम कर रहा है, लेकिन शक्ति बड़ी जिम्मेदारियों के साथ आती है। इसलिए, बहुत सावधानी के साथ पूर्वनिर्मित कार्यों का उपयोग करें।

कुछ डेवलपर्स अतिरिक्त 20 तरीकों के कारण केस क्लासेस लिखने से बचते हैं, जिन्हें आप क्लास फाइल डिसाइड करके देख सकते हैं।

यदि आप किसी केस क्लास के अंदर सभी तरीकों की जाँच करना चाहते हैं तो कृपया इस लिंक को देखें


1
  • केस कक्षाएं लागू और अप्राप्य विधियों के साथ एक कॉम्ग्नन ऑब्जेक्ट को परिभाषित करती हैं
  • केस क्लासेस सीरियलाइज़ करने योग्य है
  • केस कक्षाएं हैशकोड और कॉपी विधियों के बराबर परिभाषित होती हैं
  • कंस्ट्रक्टर की सभी विशेषताएं वैल (सिंटैक्टिक शुगर) हैं

1

कुछ प्रमुख विशेषताएं case classesनीचे सूचीबद्ध हैं

  1. मामले की कक्षाएं अपरिवर्तनीय हैं।
  2. आप बिना newकीवर्ड के केस क्लासेस को तुरंत इंस्टाल कर सकते हैं ।
  3. मामले वर्गों की तुलना मूल्य द्वारा की जा सकती है

स्काला डॉक्स से लिया गया स्कैला फिडल पर नमूना स्कैला कोड।

https://scalafiddle.io/sf/34XEQyE/0

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.