"สวัสดี วันนี้ฉันจะบอกคุณว่าสแต็กเทรซคืออะไร แต่ก่อนอื่นฉันต้องบอกคุณก่อนว่าสแต็กคืออะไร"
"ลองนึกภาพกองเอกสาร – คำสั่งสำหรับพนักงานคนหนึ่ง คุณสามารถวางงานใหม่ไว้บนสุดของกอง หรือคุณสามารถรับงานจากด้านบน ซึ่งหมายความว่างานจะไม่ถูกดำเนินการตามลำดับที่ได้รับ . งานที่วางไว้บนกองล่าสุดจะเป็นงานแรกที่ดำเนินการโครงสร้างองค์ประกอบของคอลเลกชันด้วยวิธีนี้จะสร้างกอง "
" Java มีคอลเล็กชันพิเศษสำหรับสิ่งนั้น – Stackเป็นคอลเล็กชันที่มีวิธีการ 'เพิ่มองค์ประกอบ' และ 'รับ (รับ) องค์ประกอบ' อย่างที่คุณเดาได้ องค์ประกอบที่ถูกเพิ่มล่าสุดจะเป็นองค์ประกอบแรกที่ ถูกจับ"
"ฟังดูค่อนข้างตรงไปตรงมา"
"เยี่ยมมาก ตอนนี้ฉันจะอธิบายว่าสแต็กเทรซคืออะไร"
"ลองนึกภาพว่าในโปรแกรม Java วิธีการ Aเรียกว่าmethod Bซึ่งเรียกว่าmethod Cซึ่งต่อมาเรียกว่าmethod Dในการออกจากเมธอด Bเราต้องออกจากเมธอด C ก่อน และในการทำเช่นนั้น เราต้องออกจากเมธอด D ก่อน สิ่งนี้ พฤติกรรมคล้ายกับกอง "
“ทำไมถึงบอกว่าคล้าย”
"หากต้องการทำงานบางอย่างที่อยู่ตรงกลางกองกระดาษของเรา คุณต้องดำเนินการงานทั้งหมดที่อยู่ด้านบนก่อน"
"มีความคล้ายคลึงกัน แต่ฉันไม่แน่ใจว่าฉันเข้าใจทุกอย่างถูกต้อง"
"ดูสิ กองเป็นชุดขององค์ประกอบต่างๆ เหมือนกับเศษกระดาษในกอง ในการหยิบกระดาษแผ่นที่สามจากด้านบน คุณต้องหยิบชิ้นที่สองก่อน และสำหรับการนั้น คุณต้องหยิบชิ้นแรก คุณ ใส่และหยิบกระดาษได้ตลอดเวลา แต่คุณต้องเอากระดาษด้านบนออกก่อนเสมอ"
"เช่นเดียวกันกับการเรียกใช้ฟังก์ชันวิธีการ Aเรียกใช้เมธอด Bซึ่งเรียกใช้เมธอด CในการออกจากAคุณต้องออกจากB ก่อน และในการทำเช่นนั้น คุณต้องออกจากC "
"เดี๋ยวก่อน ถ้าฉันเข้าใจสิ่งที่คุณพูด แนวคิดทั้งหมดของสแต็กจะจบลงที่ 'นำกระดาษที่เพิ่มล่าสุด' และ 'คุณสามารถออกจากวิธีที่คุณป้อนล่าสุดเท่านั้น' ถูกต้องหรือไม่ "
"ใช่ ลำดับของการเรียกใช้ฟังก์ชันเรียกว่า 'call stack' หรือเรียกง่ายๆ ว่า 'stack' ฟังก์ชันสุดท้ายที่เรียกใช้คือฟังก์ชันแรกที่สิ้นสุดลองมาดูตัวอย่างกัน"
รับและแสดง call stack ปัจจุบัน: |
---|
|
ผลลัพธ์: |
|
"ตกลง ฉันเข้าใจทุกอย่างเกี่ยวกับการเรียกใช้ฟังก์ชัน แต่ StackTraceElement คืออะไร"
"Java Machine ติดตามการเรียกใช้ฟังก์ชันทั้งหมด ด้วยเหตุนี้จึงมีคอลเลกชันพิเศษ - สแต็ก เมื่อฟังก์ชันหนึ่งเรียกอีกฟังก์ชันหนึ่ง Java Machine จะใส่ออบเจกต์ StackTraceElement ใหม่ลงในสแต็ก เมื่อฟังก์ชันเสร็จสิ้น อิลิเมนต์นั้นจะถูกลบออก จากสแต็กซึ่งหมายความว่าสแต็กจะเก็บข้อมูลที่เป็นปัจจุบันอยู่เสมอเกี่ยวกับสถานะปัจจุบันของ 'การเรียกใช้ฟังก์ชันสแต็ก' "
"แต่ละ วัตถุ StackTraceElementมีข้อมูลเกี่ยวกับเมธอดที่เรียก โดยเฉพาะอย่างยิ่ง คุณสามารถรับชื่อเมธอดโดยใช้ เมธอด getMethodName "
"คุณสามารถดูวิธีการทำงานในตัวอย่างด้านบน:
1) เราได้รับคอลสแตก
2) เราใช้for-eachเพื่อผ่านมันไป ฉันหวังว่าคุณจะยังไม่ลืมว่ามันคืออะไร
3) เราส่งออกชื่อเมธอดไปที่System.out "
"น่าทึ่ง! และไม่ซับซ้อนเกินไป ขอบคุณ Rishi!"
GO TO FULL VERSION