ฉันอาจต้องเปลี่ยนมาใช้ Java สำหรับโครงการใหม่ ฉันมีความรู้น้อยมากเกี่ยวกับ Java เพราะฉันได้ศึกษาและใช้ C # เป็นหลักและฉันกลัวว่าความแตกต่างระหว่างสองภาษา / แพลตฟอร์มนี้น่าจะทำให้เกิดปัญหามากมาย
ข้อผิดพลาด / gotchas ใดที่ฉันควรดูแล
ฉันอาจต้องเปลี่ยนมาใช้ Java สำหรับโครงการใหม่ ฉันมีความรู้น้อยมากเกี่ยวกับ Java เพราะฉันได้ศึกษาและใช้ C # เป็นหลักและฉันกลัวว่าความแตกต่างระหว่างสองภาษา / แพลตฟอร์มนี้น่าจะทำให้เกิดปัญหามากมาย
ข้อผิดพลาด / gotchas ใดที่ฉันควรดูแล
คำตอบ:
นี่คือ gotchas Java ที่สำคัญเมื่อมาจาก C #:
switch
กรณีต่างๆสามารถล้มลงไปในอีกกรณีหนึ่งได้อย่างเงียบ ๆ ดังนั้นคุณควรใส่break
ทุกครั้งที่เหมาะสม คุณไม่สามารถswitch
เปิดString
ใน Java ได้List<int>
List<Integer>
Autoboxing ซ่อนฟุ่มเฟื่อย แต่คุณจะได้รับเมื่อแกะกล่องNullPointerException
null
นอกจากนี้==
และ!=
ในรุ่นดั้งเดิมสองชนิดบรรจุกล่องทำการเปรียบเทียบการอ้างอิง
==
และ!=
ในสองประเภทการอ้างอิง (เช่นString
) เป็นการเปรียบเทียบการอ้างอิงเสมอint
สามารถ autoboxed ไปยังInteger
; ไม่มี autoboxing จากไปint[]
Integer[]
byte
, short
, int
, long
มีการลงนามเท่านั้น เฝ้าดูส่วนขยายสัญญาณที่ไม่ตั้งใจsub*
วิธีการสืบค้นที่มีระยะไกลส่วนใหญ่จะใช้ขอบเขตล่างรวมและขอบบนแบบเอกสิทธิ์
ในบางหัวข้อที่ระบุไว้ข้างต้น:
new Integer(i) == i
ใน Java? (ใช่!)==
/ !=
) การเปิดกล่องข้อความอัตโนมัติเกิดขึ้นหรือไม่ (NO!)int num = Integer.getInteger("123")
โยนNullPointerException
? (!!!)บน Java gotchas ทั่วไป:
หนึ่งในอันตรายที่เห็นได้ชัดคือการเปรียบเทียบสตริงด้วย C # สไตล์string1 == string2
(Java เปรียบเทียบอ้างอิงเท่านั้น) string1.equals(string2)
แทนรูปแบบ
อีกอันหนึ่งคือprivate
ตัวปรับเปลี่ยนการเข้าถึงเริ่มต้นใน C # package
ใน Java
นอกจากนี้ToString()
เมธอดจะไม่แปลงเป็นภาษาท้องถิ่นโดยอัตโนมัติในวัฒนธรรมปัจจุบันใน Java
อันที่ทำให้ฉันคือJava substring args คือ startIndex, endIndex ในขณะที่C # Subtring args คือ startIndex, length มีความแตกต่างมากพอที่จะทำให้มันน่ารำคาญและมีโอกาสที่ดีที่จะทำให้ดัชนีไม่อยู่ในขอบเขตที่คุณสลับ
ฮึ่ม
meta-pitfall ที่ใหญ่ที่สุดคือการสันนิษฐานว่าภาษา Java และไลบรารี่มีพฤติกรรมเหมือนกับสิ่งที่คล้ายกันใน C # ทำแบบฝึกหัดอ่าน javadocs อย่าคิดว่า ...
meta-pitfall ก็คือการสมมติว่าความจริงที่ว่าคุณสามารถทำบางสิ่งใน Java ได้อย่างเท่าเทียมกันอย่างง่ายดาย / อย่างที่คุณสามารถทำได้ใน C # มันไม่เป็นความจริง Java เป็นภาษาที่เก่ากว่ามากและมีข้อผิดพลาดเกิดขึ้น ...
และ meta-pitfall สุดท้ายคือการคิดว่าการบ่นเกี่ยวกับสิ่งที่ขาดหายไป / แตกต่างใน Java บน SO จะทำให้คุณได้รับคำตอบที่เห็นอกเห็นใจ / สนับสนุนในระดับสากล!
ระวังความแตกต่างในตัวดัดแปลงการเข้าถึงเริ่มต้น นอกจากนี้โปรดทราบว่าวิธีการที่ไม่คงที่ทั้งหมดใน Java เป็นเสมือน (ยกเว้นว่าคุณทำเครื่องหมายเป็นขั้นสุดท้าย)
แม้ว่าจะค่อนข้างล้าสมัย แต่ฉันพบว่านี่เป็นข้อมูลอ้างอิงที่ดี
Also note that all non-static methods in Java are virtual.
ฉันต้องการให้ C # เป็นเช่นนี้ได้อย่างไร
ขึ้นอยู่กับโปรแกรมที่คุณใช้งานอยู่ Wikipedia มีบทความนี้และค่อนข้างกว้างขวาง (ตรวจสอบออกส่วน "การเชื่อมโยงภายนอก" ที่สิ้นสุด) http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp
นอกจากนี้ฉันอ่านบทความนี้เมื่อฉันเปลี่ยนจาก C # เป็น Java http://www.25hoursaday.com/CsharpVsJava.htmlและมันก็มีประโยชน์มาก
ฉันคิดว่าคำถามของคุณเป็นเรื่องส่วนตัว ไม่สามารถอธิบายได้ทั้งหมดที่นี่ ผมขอแนะนำให้คุณอ่านJava puzzlersJoshua Bloch and Neal Gafter
โดย คุณสามารถเรียนรู้เพิ่มเติมและปลอดภัยจากข้อผิดพลาด
ในภาษาจาวามีวัตถุประสงค์เทียบเท่าประเภทดั้งเดิมเช่น int, char ไม่ใช่ "ประเภทค่า" (เช่นจำนวนเต็มเป็นประเภทอ้างอิง) ใน C # the System.Int32 เป็นโครงสร้าง