ใน Java คุณสามารถพิจารณาพฤติกรรมของโปรแกรมที่ไม่ถูกต้องตรงกันได้
Java 7 JLS ใช้คำว่า "undefined" หนึ่งครั้งใน17.4.8 การประหารชีวิตและข้อกำหนดของเวรกรรม :
เราใช้f|d
เพื่อแสดงถึงฟังก์ชั่นที่ได้รับจากการ จำกัด โดเมนของการf
d
สำหรับทั้งหมดx
ในd
, f|d(x) = f(x)
และทั้งหมดx
ไม่ได้อยู่ในd
, f|d(x)
มีการกำหนด ...
เอกสารคู่มือ Java API ระบุบางกรณีเมื่อผลลัพธ์ไม่ได้กำหนดตัวอย่างเช่นในวันที่ของตัวสร้าง (คัดค้าน) (ปี int, เดือน int, วัน int) :
ผลลัพธ์ไม่ได้ถูกกำหนดหากอาร์กิวเมนต์ที่กำหนดนั้นไม่อยู่ในขอบเขต ...
Javadocs สำหรับสถานะExecutorService.invokeAll (Collection) :
ผลลัพธ์ของวิธีนี้จะไม่ได้กำหนดหากมีการแก้ไขการรวบรวมในขณะที่การดำเนินการนี้กำลังดำเนินการ ...
พฤติกรรมที่เป็นทางการน้อยลงของ "ไม่ได้กำหนด" สามารถพบได้ในConcurrentModificationExceptionซึ่งเอกสาร API ใช้คำว่า "พยายามอย่างดีที่สุด":
โปรดทราบว่าพฤติกรรมที่ล้มเหลวอย่างรวดเร็วไม่สามารถรับประกันได้ว่าเป็นไปไม่ได้ที่จะทำการค้ำประกันอย่างหนักเมื่อมีการปรับเปลี่ยนพร้อมกันที่ไม่ซิงโครไนซ์ การดำเนินการล้มเหลวอย่างรวดเร็วโยนConcurrentModificationException
ในที่ดีที่สุดความพยายามพื้นฐาน ดังนั้นมันจะผิดที่จะเขียนโปรแกรมที่ขึ้นอยู่กับข้อยกเว้นนี้สำหรับความถูกต้องของมัน ...
ภาคผนวก
หนึ่งในคำถามที่ความคิดเห็นหมายถึงบทความโดยเอริค Lippert ซึ่งมีการแนะนำที่เป็นประโยชน์ลงไปในเรื่องหัวข้อ: การพฤติกรรมการดำเนินงานที่กำหนดไว้
ฉันแนะนำบทความนี้สำหรับเหตุผลเกี่ยวกับภาษาซึ่งไม่เชื่อเรื่องพระเจ้าถึงแม้ว่ามันจะคุ้มค่าที่จะจำไว้ว่าผู้เขียนมีเป้าหมายเป็น C # ไม่ใช่ Java
ตามเนื้อผ้าเราบอกว่าสำนวนภาษาการเขียนโปรแกรมมีพฤติกรรมที่ไม่ได้กำหนดหากการใช้สำนวนนั้นสามารถมีผลกระทบใด ๆ ; สามารถทำงานได้ตามที่คุณคาดหวังหรือสามารถลบฮาร์ดดิสก์ของคุณหรือทำให้เครื่องเสียหาย นอกจากนี้ผู้เขียนคอมไพเลอร์ไม่มีข้อผูกมัดที่จะเตือนคุณเกี่ยวกับพฤติกรรมที่ไม่ได้กำหนด (และในความเป็นจริงมีบางภาษาที่โปรแกรมที่ใช้สำนวน "พฤติกรรมที่ไม่ได้กำหนด" ได้รับอนุญาตจากข้อกำหนดภาษาเพื่อคอมไพเลอร์!) ...
ในทางตรงกันข้ามสำนวนที่มีพฤติกรรมที่กำหนดโดยการนำไปใช้นั้นเป็นพฤติกรรมที่ผู้เขียนคอมไพเลอร์มีหลายทางเลือกเกี่ยวกับวิธีการนำคุณลักษณะไปใช้และต้องเลือกอย่างใดอย่างหนึ่ง อย่างที่ชื่อบ่งบอกว่าพฤติกรรมที่กำหนดโดยการนำไปปฏิบัตินั้นมีการกำหนดไว้อย่างน้อยที่สุด ตัวอย่างเช่น C # อนุญาตให้มีการใช้งานเพื่อโยนข้อยกเว้นหรือสร้างมูลค่าเมื่อการหารจำนวนเต็มล้น แต่การใช้งานจะต้องเลือกหนึ่ง ไม่สามารถลบฮาร์ดดิสก์ของคุณ ...
อะไรคือปัจจัยบางอย่างที่ทำให้คณะกรรมการออกแบบภาษาปล่อยให้สำนวนภาษาบางอย่างเป็นพฤติกรรมที่ไม่ได้กำหนดไว้หรือการใช้งานที่กำหนดไว้
ปัจจัยสำคัญอันดับแรกคือ: มีการใช้งานของสองภาษาที่มีอยู่ในตลาดที่ไม่เห็นด้วยกับพฤติกรรมของโปรแกรมเฉพาะหรือไม่ ...
ปัจจัยสำคัญต่อไปคือ: คุณสมบัตินี้นำเสนอความเป็นไปได้ที่แตกต่างกันหลายประการสำหรับการนำไปใช้งานจริงหรือไม่ซึ่งบางอย่างดีกว่าอย่างอื่นหรือไม่? ...
ปัจจัยที่สามคือ: คุณสมบัติซับซ้อนหรือไม่ที่รายละเอียดของพฤติกรรมที่แน่นอนนั้นยากหรือแพง ...
ปัจจัยที่สี่คือ: ฟีเจอร์กำหนดภาระสูงให้คอมไพเลอร์วิเคราะห์หรือไม่? ...
ปัจจัยที่ห้าคือ: คุณลักษณะนี้ทำให้เกิดภาระสูงในสภาพแวดล้อมรันไทม์หรือไม่? ...
ปัจจัยที่หกคือ: การกำหนดพฤติกรรมทำให้มีการเพิ่มประสิทธิภาพที่สำคัญหรือไม่? ...
เหล่านี้เป็นเพียงไม่กี่ปัจจัยที่มาถึงใจ; แน่นอนว่ามีปัจจัยอื่น ๆ อีกมากมายที่คณะกรรมการออกแบบภาษาโต้เถียงกันก่อนที่จะสร้างคุณลักษณะ "การนำไปปฏิบัติที่กำหนด" หรือ "ไม่ได้กำหนด"
ข้างต้นเป็นเพียงความคุ้มครองสั้น ๆ ; บทความเต็มมีคำอธิบายและตัวอย่างสำหรับจุดที่กล่าวถึงในข้อความที่ตัดตอนมานี้; มันเป็นมากมูลค่าการอ่าน ตัวอย่างเช่นรายละเอียดที่ให้ไว้สำหรับ "ปัจจัยที่หก" สามารถให้ข้อมูลเชิงลึกเกี่ยวกับแรงจูงใจสำหรับข้อความมากมายใน Java Memory Model ( JSR 133 ) ช่วยให้เข้าใจว่าเหตุใดการเพิ่มประสิทธิภาพบางอย่างจึงได้รับอนุญาตนำไปสู่พฤติกรรมที่ไม่ได้กำหนด ข้อ จำกัด ชอบเกิดขึ้นมาก่อนและความต้องการของเวรกรรม
ไม่มีบทความใดที่เป็นเนื้อหาใหม่สำหรับฉัน แต่ฉันจะถูกประณามถ้าฉันเคยเห็นมันนำเสนอในรูปแบบที่สวยงามสุภาพและเข้าใจง่าย น่าอัศจรรย์