Companion Object in Scala

olvasási idő: 4 perc

a társobjektumok használatának megértése érdekében fontos, hogy először megértsük a statikus tagokat. Megtanultuk, hogy az objektumorientált nyelvekben az osztályok a tervrajz, amely tagokat, például mezőket és módszereket tartalmaz. De ahhoz, hogy hozzáférjünk ezekhez a mezőkhöz vagy metódusokhoz, először meg kell építenünk az objektumokat ezekből az osztályokból.

nézzünk meg egy példát.

class Math { private val max = 100 def sum(a: Int, b: Int): Int = a + b}object Test { def main(args: Array): Unit = { val math = new Math() math.sum(5, 10) }}

létrehoztunk egy Math nevű osztályt egy sum nevű módszerrel, amely két számot vesz fel, és az eredményt adja vissza.

ennek a kódnak a végrehajtásához létrehozunk egy példányt ebből a matematikai osztályból, és meghívjuk a sum metódust, megkerülve az 5-öt és a 10-et, 15-öt fogadva kimenetként. Amint azonban látjuk, az összeg módszer nem függ a matematikai osztály egyik tagváltozójától sem.

például a max tag változó ebben az esetben. Tehát nem kell létrehozni a matematikai osztály példányát az összeg metódus meghívásához. Ebben az esetben ezt közvetlenül meg kell tudnunk hívni. És ez az, ahol a társ tárgyak jönnek a képbe.

négy dolgot kell megjegyeznünk a társobjektumokról:

1. Ugyanaz a nevük, mint a megfelelő osztálynak.

2. Az “objektum” kulcsszóval kezdődnek.

3. Ugyanabban a forrásfájlban élnek, mint a megfelelő osztályok.

4. A társ objektumok és a hozzájuk tartozó osztályok egymás privát tagjaiként működnek.

az “object” kulcsszó azt mondja, hogy ez egy egyedülálló objektum. Más szavakkal, ez azt jelenti, hogy amíg a program fut, annyi példányt hozhat létre az osztályokból, amennyit csak akar, de a singleton objektum csak egy lenne, és nem lesz több példánya.

lássuk őket működés közben a matematikai példánk segítségével.

object Math { def sum(a: Int, b: Int): Int = a + b def getPrivateMember: Int = = new Math().max}class Math { private val max = 100}object Test { def main(args: Array): Unit = { Math.sum(5, 10) Math.getPrivateMember }}

mint látjuk, létrehoztunk egy új szingulett objektumot, a Math nevet, amelynek ugyanaz a neve, mint az osztálymatekunknak. Az “objektum” kulcsszóval kezdődik, és ugyanabban a fájlban marad, mint a Math osztály.

áthelyeztük az összeg implementációját az osztályból a társobjektumába. Ennek oka az, hogy mivel tudjuk, hogy az összeg implementáció nem függ a Math osztály tagváltozóitól, az implementáció beillesztése a companion objektumba segít a hívóknak abban, hogy ne hozzák létre a Math osztály példányát, és közvetlenül hívják meg.

van egy másik módszer, amelyet írtunk annak bemutatására, hogy a társobjektum hozzáfér az osztályának privát tagjaihoz.

itt a Getprivatemember példányosítja a matematikai osztályt, és visszaadja a “max”nevű privát tagot. Van még egy dolog, amit itt meg kell jegyezni. A getPrivateMember meghatározásakor nem helyeztük el a zárójeleket. A Scala-ban van egy konvenció, amelyben ha a módszer nem tartalmaz érveket, és nem végez semmilyen mellékhatást, ami azt jelenti, hogy ez egy tiszta funkció, akkor dönthetünk úgy, hogy elhagyjuk a zárójeleket.

itt a getprivatemember csak a tagváltozó értékét adja vissza, ezért úgy döntünk, hogy kihagyjuk a zárójeleket.

Math.sum(5, 10)Math.getPrivateMember

amikor végrehajtjuk a sum metódust, a Math companion objektumból hajtottuk végre, és nem kellett létrehoznunk a Math class új példányát. Ezenkívül hozzáférhettünk a Math osztály privát tagváltozójához a companion objektumból.

objektumok létrehozása az Apply használatával

tudjuk, hogy egy objektum új példányának létrehozásához az “új” kulcsszót kell használnunk.

például:

class Person(firstName: String, lastName: String) {def getName: String = firstName + lastName}object Test { def main(args: Array): Unit = { val alice = new Person("Alice", "Christy") }}

van egy “személy” nevű osztályunk, amelynek keresztneve és vezetékneve az osztály paraméterei. Létrehozunk egy új személypéldányt a fentiek szerint. Létrehoztuk az “alice” – t, mint egy új személyt, átadva a keresztnevet és a vezetéknevet.

a Scalában azonban van még egy módszer objektumok létrehozására az új kulcsszó használata nélkül.

van egy “apply” nevű módszer a companion object-ben, amelyet kifejezetten a Scala fordító kezel, és lehetővé teszi az osztályok új példányainak létrehozását az új kulcsszó nélkül. Tanuljuk meg, hogyan kell használni a kódunkban.

object Person { def apply(firstName: String, lastName: String): Person = new Person(firstName, lastName)}class Person(firstName: String, lastName: String) { def getName: String = firstName + " " + lastName}object Test { def main(args: Array): Unit = { val alice = Person("Alice", "Christy") println(p.getName) }}

mint itt látjuk, létrehoztunk egy társobjektumot az apply metódussal. A Person osztály egy példányának létrehozásához szükséges érveket tartalmazza, belsőleg létrehozza a Person példányt, és visszaadja a példányt. Mint látjuk, az új kulcsszó használata nélkül hoztuk létre a person osztály példányát. És hozzáférhetünk a tagokhoz, mint bármely más tárgyhoz. 6

ez az egész a Companion objektum ebben a blogban. Tanulj Tovább, Növekedj Tovább!!!

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.