เปลี่ยนจาก C # เป็น Java ซึ่ง“ gotchas” ฉันควรสนใจอะไร


9

ฉันอาจต้องเปลี่ยนมาใช้ Java สำหรับโครงการใหม่ ฉันมีความรู้น้อยมากเกี่ยวกับ Java เพราะฉันได้ศึกษาและใช้ C # เป็นหลักและฉันกลัวว่าความแตกต่างระหว่างสองภาษา / แพลตฟอร์มนี้น่าจะทำให้เกิดปัญหามากมาย

ข้อผิดพลาด / gotchas ใดที่ฉันควรดูแล


ฉันคิดว่าบล็อกนี้ครอบคลุมหลายสิ่งหลายอย่างที่คุณกำลังหา .. ericsink.com/entries/java_eclipse_2.html
Hari Menon

3
มีความแตกต่างมากมายระหว่าง C # และ Java และแต่ละคำตอบคือ "คำตอบ" สำหรับคำถามนี้ อย่างไรก็ตามฉันสงสัยว่ามันจะมีประโยชน์มากสำหรับคุณหรือคนอื่น ๆ การถามคำถามจริงที่เฉพาะเจาะจงมากขึ้นจะทำให้ได้คำตอบที่มีประโยชน์มากขึ้น หรือลองขอข้อมูลอ้างอิงหรือคำแนะนำในการเปลี่ยนจาก C # เป็น Java แทนความแตกต่าง (ไม่มีที่สิ้นสุดอย่างมีประสิทธิภาพ)

กล่าวอีกนัยหนึ่งลองถามคำถาม"ทำไม" หรือ "อย่างไร"เกี่ยวกับปัญหาที่เฉพาะเจาะจงแทน ตัวอย่างเช่นการขอการอ้างอิงคำแนะนำหรือหนังสือก็เหมือนกับการถามว่า "ฉันจะสลับจาก C # เป็น Java" ได้อย่างไรหรือถามเกี่ยวกับรหัสเฉพาะที่คุณไม่เข้าใจเป็นคำถามที่ว่า "ทำไมจึงทำ X แทน Y"

พิจารณาสร้างชุมชนวิกินี้
finnw

คำตอบ:


36

นี่คือ gotchas Java ที่สำคัญเมื่อมาจาก C #:

  • ใน Java switchกรณีต่างๆสามารถล้มลงไปในอีกกรณีหนึ่งได้อย่างเงียบ ๆ ดังนั้นคุณควรใส่breakทุกครั้งที่เหมาะสม คุณไม่สามารถswitchเปิดStringใน Java ได้
  • ยาสามัญไม่ได้รับการตรวจทานซ้ำและปรับเปลี่ยนได้พร้อมกับประเภทการอ้างอิงเท่านั้น ไม่มีเพียงList<int> List<Integer>Autoboxing ซ่อนฟุ่มเฟื่อย แต่คุณจะได้รับเมื่อแกะกล่องNullPointerException nullนอกจากนี้==และ!=ในรุ่นดั้งเดิมสองชนิดบรรจุกล่องทำการเปรียบเทียบการอ้างอิง
    • ... เพราะ==และ!=ในสองประเภทการอ้างอิง (เช่นString) เป็นการเปรียบเทียบการอ้างอิงเสมอ
    • intสามารถ autoboxed ไปยังInteger; ไม่มี autoboxing จากไปint[]Integer[]
  • ของ Java byte, short, int, longมีการลงนามเท่านั้น เฝ้าดูส่วนขยายสัญญาณที่ไม่ตั้งใจ
  • ไม่มีอาร์เรย์หลายมิติเฉพาะอาร์เรย์ใน Java
  • sub*วิธีการสืบค้นที่มีระยะไกลส่วนใหญ่จะใช้ขอบเขตล่างรวมและขอบบนแบบเอกสิทธิ์

ดูสิ่งนี้ด้วย

คำถามที่เกี่ยวข้อง

ในบางหัวข้อที่ระบุไว้ข้างต้น:

บน Java gotchas ทั่วไป:


8
ตอนนี้คุณสามารถเปิดใช้งาน String ใน Java SE 7
Malcolm

+1 สำหรับGenerics นั้นไม่ได้รับการตรวจสอบซ้ำและปรับเปลี่ยนได้ตามประเภทการอ้างอิงเท่านั้นสิ่งนี้ช่วยฉันได้มากในวันนี้
cctan

คุณควรเพิ่ม java ไม่มีโครงสร้าง

13

หนึ่งในอันตรายที่เห็นได้ชัดคือการเปรียบเทียบสตริงด้วย C # สไตล์string1 == string2(Java เปรียบเทียบอ้างอิงเท่านั้น) string1.equals(string2)แทนรูปแบบ

อีกอันหนึ่งคือprivateตัวปรับเปลี่ยนการเข้าถึงเริ่มต้นใน C # packageใน Java

นอกจากนี้ToString()เมธอดจะไม่แปลงเป็นภาษาท้องถิ่นโดยอัตโนมัติในวัฒนธรรมปัจจุบันใน Java


นี่คือส่วนขยายของความจริงที่ว่าไม่มีตัวดำเนินการโอเวอร์โหลด
Graphain

3
ไม่ถูกต้อง. Package-private เป็นตัวดัดแปลงการเข้าถึงเริ่มต้นของ Java
Oliver Weiler

@ วิธีช่วย: โอ้ขอโทษ ฉันหมายถึง C # มีความเป็นส่วนตัวเป็นค่าเริ่มต้น แต่ไม่ใช่ Java ตอนนี้แก้ไขแล้ว

12

อันที่ทำให้ฉันคือJava substring args คือ startIndex, endIndex ในขณะที่C # Subtring args คือ startIndex, length มีความแตกต่างมากพอที่จะทำให้มันน่ารำคาญและมีโอกาสที่ดีที่จะทำให้ดัชนีไม่อยู่ในขอบเขตที่คุณสลับ


3
+1 ความสับสนมากขึ้นคือความจริงที่ว่ามันเป็น startIndex รวมและ endIndex เอกสิทธิ์ ... และมีบางส่วนของ API ที่พบใน JDK ซึ่งใช้ startIndex วิธียาว ...
Oliver Weiler

10
  • คุณไม่ได้รับ LINQ
  • คุณไม่มี UI ที่ดูดี (ไม่มี WPF)
  • ไม่มีคุณสมบัติ
  • คุณเต้นรำกับชาวอียิปต์
  • คุณได้รับ API โดยไม่มีตัวอย่างและเอกสารประกอบที่ดี

ฮึ่ม


2
ไม่เคยพบ Java API ที่ไม่ดี (อันที่จริงแล้วใช้งานง่าย) แต่มีตัวอย่างน้อยกว่า สิ่งนี้เกี่ยวกับชาวอียิปต์?
Graphain

3
ฉันกำลังปฏิวัติเรื่องนี้ ...... แม้ว่าจะเป็นการประชดประชันที่ต่ำ
mpen


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

2
@cloudanger: เห็นด้วยกับคุณ ข้อผิดพลาดควรเป็นสิ่งที่ "ทำงาน" อย่างผิดพลาดไม่ใช่สิ่งที่ไม่ทำงาน
Vimvq1987

10
  • Java enums นั้นมีประสิทธิภาพ / ซับซ้อนกว่า แต่จริง ๆ แล้วเป็นคลาสจริงแทนที่จะเป็นจำนวนเต็ม
  • คลาสภายในใน java มีประสิทธิภาพมากกว่า (และทำงานแตกต่างกัน)
  • ไม่มีผู้รับมอบสิทธิ์วัตถุที่ใช้งานได้เท่านั้น
  • ตัวสร้างการโยงทึมมีไวยากรณ์ที่แตกต่างกันอย่างสิ้นเชิงในทั้งสองภาษาฉันมักจะล้มเหลวทุกครั้งที่ฉันต้องทำเช่นนั้นใน c #
  • Java ได้ขยายสำหรับ subclassing และใช้สำหรับอินเตอร์เฟสซึ่งค่อนข้างดี C # จะถ่ายทอดการประชุมการตั้งชื่อซึ่งบอกว่าอินเตอร์เฟสเริ่มต้นด้วยตัวพิมพ์ใหญ่ I ในชื่อของพวกเขา ฉันไม่ชอบการประชุมเพราะฉันไม่สามารถมั่นใจได้ว่าจะมีคนอื่นล้มเหลว
  • java autoboxing สามารถกัดคุณได้ใน **
  • การลบประเภทจาวาทำให้สิ่งต่าง ๆ มีความซับซ้อนมากขึ้น

2
คุณล้อเล่นใช่มั้ย -1 อย่างไรก็ตาม คุณไม่สามารถจริงจัง

3
อย่างน้อยคุณควรบอกให้ชัดเจนว่าคุณไม่ชอบจุดไหนมิฉะนั้นฉันต้องสมมติว่าคุณกำลังหลอก
atamanroman

2
ตอนนี้ไม่เพียง แต่ล้อเล่นของคุณ แต่คุณก็ยังไม่รู้: linux มีความสำคัญในพื้นที่แบ็กเอนด์ javadoc นั้นสะอาดกว่าไฟล์ช่วยเหลือ ms โง่ ๆ เหล่านี้ซึ่งจะไม่ทำงานหากคุณดูจากเครือข่ายแชร์ Sandcastle นั้นแทบจะไม่ถูกบันทึกและใช้ไม่ได้เลยหากไม่มี GUI ที่เหมาะสม ppl ส่วนใหญ่จะยอมรับว่ามีคอลเลกชันที่ดีจริงๆในจาวาเฟรมเวิร์กและ joshua bloch ทำงานได้ดีที่นั่น และหนังสือ "ปัญญาชน" เป็นเพียงหนังสือที่คุณไม่เข้าใจ Eclipse เป็น IDE ที่ยอดเยี่ยมที่ VS ไม่สามารถใช้ปลั๊กอินภายนอกได้ Btw: ฉันชอบ C # และพลาด linq ใน java ออกจาก ms-office-world ของคุณ
atamanroman

1
รายการเดียวเท่านั้นเหล่านี้คือ gotcha
finnw

1
-1 จากฉันเช่นกันคุณไม่ทราบว่า IDE ที่ดีคืออะไร (ดังนั้นจึงไม่ทราบว่าเกี่ยวข้องกับการเขียนโปรแกรมอะไรมาก) แก้ไข: Pffft Java เป็นผู้ใหญ่มากขึ้น Java ไม่ได้มี generics จริง ..

6

meta-pitfall ที่ใหญ่ที่สุดคือการสันนิษฐานว่าภาษา Java และไลบรารี่มีพฤติกรรมเหมือนกับสิ่งที่คล้ายกันใน C # ทำแบบฝึกหัดอ่าน javadocs อย่าคิดว่า ...

meta-pitfall ก็คือการสมมติว่าความจริงที่ว่าคุณสามารถทำบางสิ่งใน Java ได้อย่างเท่าเทียมกันอย่างง่ายดาย / อย่างที่คุณสามารถทำได้ใน C # มันไม่เป็นความจริง Java เป็นภาษาที่เก่ากว่ามากและมีข้อผิดพลาดเกิดขึ้น ...

และ meta-pitfall สุดท้ายคือการคิดว่าการบ่นเกี่ยวกับสิ่งที่ขาดหายไป / แตกต่างใน Java บน SO จะทำให้คุณได้รับคำตอบที่เห็นอกเห็นใจ / สนับสนุนในระดับสากล!


3

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

แม้ว่าจะค่อนข้างล้าสมัย แต่ฉันพบว่านี่เป็นข้อมูลอ้างอิงที่ดี

เปรียบเทียบ C # และ Java โดย Dare Obasanjo


3
Also note that all non-static methods in Java are virtual.ฉันต้องการให้ C # เป็นเช่นนี้ได้อย่างไร
Graphain

3
ฉันดีใจที่ไม่ใช่เพราะมันทำลายเหตุผลของ OOP เมื่อทุกวิธีเป็นเสมือนโดยค่าเริ่มต้นคุณจะต้องเปลี่ยนคลาสทั้งหมดซึ่งโดยปกติคุณไม่ต้องการ นอกจากนี้การเปลี่ยนวิธีจาก non-final เป็น final สามารถทำลายรหัสที่ได้มาในขณะที่วิธีอื่นไม่ได้
Femaref

2

ขึ้นอยู่กับโปรแกรมที่คุณใช้งานอยู่ Wikipedia มีบทความนี้และค่อนข้างกว้างขวาง (ตรวจสอบออกส่วน "การเชื่อมโยงภายนอก" ที่สิ้นสุด) http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp

นอกจากนี้ฉันอ่านบทความนี้เมื่อฉันเปลี่ยนจาก C # เป็น Java http://www.25hoursaday.com/CsharpVsJava.htmlและมันก็มีประโยชน์มาก


0

ฉันคิดว่าคำถามของคุณเป็นเรื่องส่วนตัว ไม่สามารถอธิบายได้ทั้งหมดที่นี่ ผมขอแนะนำให้คุณอ่านJava puzzlersJoshua Bloch and Neal Gafterโดย คุณสามารถเรียนรู้เพิ่มเติมและปลอดภัยจากข้อผิดพลาด


ข้อผิดพลาดที่ไม่ได้ทั้งหมด แต่ข้อผิดพลาดซึ่งเป็นโปรแกรมเมอร์ C # มีแนวโน้มที่จะทำใน Java :)
Vimvq1987

1
@ Vimvq1987 - ไม่มีเหตุผลที่จะสมมติว่าคุณจะไม่พบกับข้อผิดพลาด "Java Puzzlers" หลังจากเปลี่ยนเป็น Java
สตีเฟ่นซี

-1

ในภาษาจาวามีวัตถุประสงค์เทียบเท่าประเภทดั้งเดิมเช่น int, char ไม่ใช่ "ประเภทค่า" (เช่นจำนวนเต็มเป็นประเภทอ้างอิง) ใน C # the System.Int32 เป็นโครงสร้าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.