เหตุใดจึงไม่มีคำหลักคงที่ใน Kotlin


29

Kotlin เป็นที่รู้จักกันดีว่าเป็นตัวแทนการแทนที่สำหรับ Java แต่ได้ทำการลบการสร้าง Java ที่รู้จักกันดี: staticคำหลัก ฟังก์ชันระดับคลาสนั้นมีให้โดยส่วนใหญ่เป็นวัตถุที่เป็นเพื่อนแทน

มีอะไรผิดปกติกับวิธีการแบบคงที่และสาขาที่วัตถุสหายให้ทางเลือกที่ดีกว่าเพื่อ? ฉันสับสนเกี่ยวกับเหตุผลและไม่พบคำอธิบายใด ๆ ในเอกสารประกอบ


4
เพียงแค่มองว่าเป็นคนที่โปรแกรมใน scala: วัตถุที่เป็นคู่หูแยกรหัสสำหรับวิธีการคงที่และไม่ใช่แบบคงที่พวกเขาสามารถขยายคลาสหรืออินเทอร์เฟซอื่น ๆ ในบริบทแบบคงที่และคุณสามารถอ้างอิงวัตถุสหายในตัวแปร ไม่แน่ใจว่าแผนที่นั้นไปที่ kotlin ได้ไหม
Phoenix

วิธีการคงที่และอะไรที่ไม่มีประโยชน์อย่างมีนัยสำคัญมากกว่าวัตถุสหาย?
แทนเนอร์ Swett

นี่ไม่ใช่เหตุผลมากขึ้นการสังเกต แต่ฉันได้เห็นว่าเมื่อเริ่มต้น (แน่นอน) โปรแกรมเมอร์เริ่มต้นค้นพบstaticคำหลักใน Java มันทันทีแพร่กระจายไปยังทุกมุมของโปรแกรมเพราะพวกเขายังไม่ได้รับการสอนการเขียนโปรแกรมเชิงวัตถุ .
Score_Under

คำตอบ:


30

Scala ยังแทนที่การประกาศระดับชั้นด้วยวัตถุ 'Singleton' ข้อได้เปรียบหลักของสิ่งนี้คือทุกสิ่งเป็นวัตถุ ใน Java สมาชิกแบบคงที่ถือว่าแตกต่างจากสมาชิกวัตถุมาก ซึ่งหมายความว่าคุณไม่สามารถทำสิ่งต่าง ๆ เช่นการนำอินเทอร์เฟซหรือวางอินสแตนซ์ของคลาสของคุณลงในแผนที่หรือส่งเป็นพารามิเตอร์ไปยังวิธีการที่นำวัตถุไปใช้ วัตถุที่แสดงร่วมอนุญาตสำหรับสิ่งเหล่านี้ นั่นคือข้อได้เปรียบ


2
นั่นเป็นจุดที่ดี และฉันคิดเสมอว่ามันแปลกที่มีซิงเกิลตันและสแตติคที่มีพฤติกรรมคล้ายกันมาก แต่ถ้าไม่มีอะไรนอกจากวัตถุที่เป็นคู่หู
user1446

1
และนี่คือเหตุผลที่ใน Java ฉันต้องการกำหนดวิธีการในวัตถุไร้สัญชาติที่สร้างขึ้นแบบคงที่มากกว่ากำหนดวิธีการคงที่
candied_orange

13

อ้างจากเอกสารอ้างอิง Kotlin :

โปรดทราบว่าแม้ว่าสมาชิกของวัตถุที่เป็นคู่หูดูเหมือนสมาชิกแบบคงที่ในภาษาอื่น ๆ ณ รันไทม์เหล่านั้นยังคงเป็นสมาชิกอินสแตนซ์ของวัตถุจริงและสามารถใช้อินเทอร์เฟซ

ฟังดูดีมากสำหรับฉันเหมือนนักออกแบบ Kotlin เห็นว่านี่เป็นข้อได้เปรียบเหนือสมาชิกแบบคงที่ของ Java

นอกจากนี้ส่วนหนึ่งเกี่ยวกับJava การทำงานร่วมกันและสมาชิกคง@JvmStaticอธิบายว่าวัตถุสหายสามารถนำมาใช้ในการสร้างสมาชิกที่มีลักษณะการทำงานได้อย่างมีประสิทธิภาพเช่นสมาชิกแบบคงที่เมื่อข้อเขียนด้วย


6

Kotlin เป็นภาษาเชิงวัตถุ ในภาษาเชิงวัตถุสิ่งที่ไม่เป็นวัตถุนั้นเป็นข้อ จำกัด ที่ทำให้หมดอำนาจอย่างมาก ชั้นเรียนไม่ใช่วัตถุ แต่วัตถุเป็นวัตถุ (duh!) ดังนั้นคำถามควรจะเป็น: ทำไมภาษาจะไม่ใช้วัตถุสหาย

อีกแง่มุมหนึ่งคือความเรียบง่าย: ทำไมมีสองสิ่งวัตถุที่มีสมาชิกอินสแตนซ์และคลาสที่มีสมาชิกแบบสแตติกเมื่อคุณสามารถมีวัตถุที่มีสมาชิกอินสแตนซ์ได้

อีกทางเลือกหนึ่งที่ใช้ในภาษาที่ได้จาก Smalltalk คือการทำให้วัตถุเป็นคลาส เช่นในชั้นเรียนของสมอลล์ทอล์คกรณีของลำดับชั้นแบบขนานของmetaclasses ใน Ruby คลาสเป็นอินสแตนซ์ของClassคลาส (และใช่นั่นหมายความว่าClassเป็นอินสแตนซ์ของตัวเอง) ในกรณีนั้น "วิธีการเรียน" เป็นจริงวิธีการปกติเช่นเดียวกับเมตาคลาสของคลาส ฉันไม่รู้ว่าทำไมการออกแบบนี้ไม่ได้เลือกใน Java (เนื่องจากใกล้เคียงกับ Smalltalk) แต่อาจมีบางอย่างที่ทำให้ระบบประเภทง่ายขึ้น (โปรดสังเกตว่าภาษาส่วนใหญ่ที่มีคลาส -as-object มีแนวโน้มที่จะเป็น ภาษาแบบไดนามิก)


1
"อีกแง่มุมหนึ่งคือความเรียบง่าย: ทำไมมีสองสิ่งวัตถุที่มีสมาชิกอินสแตนซ์และคลาสที่มีสมาชิกแบบสแตติกเมื่อคุณสามารถมีวัตถุที่มีสมาชิกอินสแตนซ์ได้": จุดดีแม้ว่านักออกแบบภาษา / ภาษาทั้งหมด บางคนมองว่ามันเป็นข้อดีที่จะสร้างแบบเฉพาะกิจสำหรับกรณีพิเศษหรือสำนวน
Giorgio

1
ฉันคิดว่าอย่างน้อยก็มีเหตุผลที่ Java ทำ (ค่อนข้าง) ใช้รูปแบบนั้น ตัวอย่างเช่นถ้าคุณมีสมาชิกMyStaticClassบางstaticคนคุณสามารถอ้างอิงMyStaticClass.classเพื่อรับClassอินสแตนซ์สำหรับชั้นเรียนนั้นได้ จากนั้นคุณสามารถใช้การสะท้อนเพื่อเข้าถึง / เรียกstaticสมาชิกของคุณ มันยังคงเป็นความจริงที่staticสมาชิกไม่ได้แนบกับอินสแตนซ์ของวัตถุใด ๆ (อย่างน้อยในแนวความคิดไม่แน่ใจว่า Java ทำอะไรได้บ้างภายใต้หน้าปก) แต่หมายความว่าอย่างน้อยข้อ จำกัด บางข้อที่เพิ่มขึ้นในคำตอบที่ยอมรับไม่ได้นำไปใช้อย่างเคร่งครัด
2560
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.