Chuyển từ C # sang Java, mà tôi cần quan tâm?


9

Tôi có thể phải chuyển sang Java cho dự án mới. Tôi có rất ít kiến ​​thức về Java, vì tôi chủ yếu nghiên cứu và sử dụng C # và tôi sợ sự khác biệt giữa hai ngôn ngữ / nền tảng này có thể gây ra cho tôi nhiều vấn đề.

Đó là những cạm bẫy / gotchas tôi nên quan tâm?


Tôi nghĩ rằng blog này bao gồm rất nhiều thứ mà bạn đang tìm kiếm .. ericsink.com/entries/java_eclipse_2.html
Hari Menon

3
nhiều sự khác biệt giữa C # và Java và mỗi một câu hỏi là một "câu trả lời" tiềm năng cho câu hỏi này. Tuy nhiên, tôi nghi ngờ rằng nó sẽ rất hữu ích cho bạn hoặc người khác. Đặt một câu hỏi cụ thể hơn, thực tế sẽ mang lại câu trả lời hữu ích hơn. Ngoài ra, hãy thử yêu cầu tham khảo hoặc hướng dẫn để chuyển từ C # sang Java thay vì sự khác biệt (thực sự vô tận).

Nói cách khác, thay vào đó, hãy thử đặt câu hỏi "tại sao" hoặc "làm thế nào" về một vấn đề cụ thể. Ví dụ: yêu cầu tài liệu tham khảo, hướng dẫn hoặc sách cũng giống như hỏi "làm thế nào tôi có thể chuyển từ C # sang Java" hoặc hỏi về mã cụ thể mà bạn không hiểu là câu hỏi "tại sao điều này làm X thay vì Y".

Hãy xem xét việc này cộng đồng wiki
finnw

Câu trả lời:


36

Dưới đây là một số vấn đề quan trọng về Java khi đến từ C #:

  • Trong Java, switchcác trường hợp có thể âm thầm rơi vào kế tiếp, vì vậy hãy đảm bảo bạn luôn đặt breakbất cứ khi nào thích hợp. Bạn cũng không thể switchvào StringJava.
  • Generics là không thống nhất và tham số hóa chỉ với các loại tham chiếu. Không có List<int>, chỉ có a List<Integer>. Autoboxing che giấu tính dài dòng, nhưng bạn có thể nhận được NullPointerExceptionkhi hủy hộp a null. Ngoài ra, ==!=trên hai loại nguyên thủy đóng hộp thực hiện so sánh tham chiếu.
    • ... bởi vì ==!=trên hai loại tham chiếu (ví dụ String) luôn là so sánh tham chiếu
    • An intcó thể được autoboxed đến một Integer; không có autoboxing từ int[]đến Integer[].
  • Java byte, short, int, longchỉ được ký kết. Theo dõi để mở rộng dấu hiệu ngoài ý muốn.
  • Không có mảng nhiều chiều, chỉ có mảng mảng trong Java.
  • Hầu hết các sub*phương thức truy vấn có phạm vi sử dụng giới hạn dưới bao gồm và giới hạn trên độc quyền

Xem thêm

Câu hỏi liên quan

Về một số chủ đề được liệt kê ở trên:

Trên nền tảng Java chung:


8
Bây giờ bạn có thể bật Chuỗi trong Java SE 7.
Malcolm

+1 cho Generics là không thể thống nhất và chỉ có thể tham số hóa với các loại tham chiếu , điều này đã giúp tôi rất nhiều ngày hôm nay
cctan

Bạn cũng nên thêm java không có cấu trúc.

13

Một cạm bẫy rõ ràng là so sánh các chuỗi với kiểu C # string1 == string2(Java chỉ so sánh các tham chiếu) thay vì kiểu Java string1.equals(string2).

Một cái khác privatelà công cụ sửa đổi truy cập mặc định trong C #, packagetrong Java.

Ngoài ra ToString()các phương thức không được tự động bản địa hóa bởi văn hóa hiện tại trong Java.


Đây là một phần mở rộng của thực tế không có quá tải nhà điều hành.
Graphain

3
Sai lầm. Gói-private là công cụ sửa đổi truy cập mặc định của Java.
Oliver Weiler

@Helper Phương pháp: Ồ, xin lỗi. Ý tôi là C # có quyền riêng tư, nhưng không phải Java. Bây giờ nó đã được chỉnh sửa.

12

Cái mà tôi nhận được là các đối số chuỗi con Java là start Index, end Index trong khi C # Subtring args là start Index , độ dài. Đó là đủ của một sự khác biệt để làm cho nó gây phiền nhiễu và một xác suất tốt để đưa chỉ số ra khỏi giới hạn theo cách bạn chuyển đổi.


3
+1 Khó hiểu hơn là thực tế, đó là bắt đầu Index INCLUSIVE và end Index ĐỘC QUYỀN ... và có một số API được tìm thấy trong JDK sử dụng start Index, cách tiếp cận độ dài ...
Oliver Weiler

10
  • Bạn không nhận được LINQ
  • Bạn không nhận được giao diện người dùng tốt (không có WPF)
  • Không có tài sản
  • Bạn có thể nhảy người Ai Cập
  • Bạn nhận được API mà không cần ví dụ và tài liệu tốt

Hừm.


2
Không bao giờ thấy API Java xấu (trên thực tế dễ điều hướng hơn) nhưng chắc chắn có ít ví dụ hơn. Điều gì về người Ai Cập?
Graphain

3
Tôi ủng hộ điều này ...... ngay cả khi đó là một cú đánh thấp châm biếm.
mở cửa


8
Đây có phải là những cạm bẫy thực sự? Tôi hiểu cạm bẫy là nguyên nhân có thể của lỗi. Đây chỉ là những thứ bạn phải sống với vì bạn không thể làm cách nào khác.

2
@cloudanger: đồng ý với bạn. Cạm bẫy phải là những điều "làm việc" sai, không phải là những điều thậm chí không hoạt động.
Vimvq1987

10
  • Các enum của Java mạnh hơn / phức tạp hơn, thực tế chúng là các lớp thực thay vì các số nguyên được đặt tên.
  • các lớp bên trong trong java mạnh hơn (và chúng hoạt động khác nhau)
  • không có đại biểu, chỉ có các đối tượng chức năng
  • constructor chained thingy có một cú pháp hoàn toàn khác nhau trong cả hai ngôn ngữ, tôi có xu hướng thất bại mỗi khi tôi phải làm điều đó trong c #
  • Java đã mở rộng để phân lớp và thực hiện các giao diện, khá hay. Thay vào đó, C # chuyển tiếp theo quy ước đặt tên cho biết các giao diện bắt đầu bằng chữ hoa I trong tên của chúng. Tôi không thích quy ước đó, vì tôi không bao giờ có thể chắc chắn nếu người khác thất bại.
  • java autoboxing có thể cắn bạn trong **
  • xóa kiểu java thực sự làm cho mọi thứ phức tạp hơn

2
Bạn đang đùa, phải không? -1, tuy nhiên. Bạn không thể nghiêm túc.

3
ít nhất bạn nên làm rõ điểm nào bạn không thích, nếu không tôi phải cho rằng bạn chỉ đang troll.
atamanroman

2
bây giờ bạn không chỉ nói đùa mà còn không biết gì: linux IS quan trọng trong khu vực phụ trợ, javadoc sạch hơn nhiều so với các tệp trợ giúp ms ngu ngốc này sẽ không hoạt động nếu bạn xem chúng từ chia sẻ mạng. lâu đài cát gần như không được ghi nhận và hoàn toàn không thể sử dụng nếu không có gui thích hợp. Hầu hết các ppl sẽ đồng ý rằng có một bộ sưu tập thực sự tốt trong khung java và joshua bloch đã làm một công việc tốt ở đó. Và những cuốn sách "egghead" chỉ là những cuốn sách bạn không hiểu. Eclipse là một IDE tuyệt vời mà VS không thể đứng mà không cần các plugin bên ngoài. Btw: Tôi thích C # và nhớ linq trong java. Hãy ra khỏi thế giới văn phòng của bạn.
atamanroman

1
Chỉ một trong những vật phẩm này là một gotcha
vây

1
-1 từ tôi cũng vậy, bạn không biết ide tốt là gì (và do đó không biết nhiều về bất cứ điều gì liên quan đến lập trình). Chỉnh sửa: Pffft Java trưởng thành hơn, Java thậm chí không có khái quát thực sự ..

6

Cạm bẫy lớn nhất là giả định rằng ngôn ngữ và thư viện Java hoạt động giống như các công cụ có giao diện tương tự trong C #. Làm hướng dẫn, đọc javadocs, đừng cho rằng ...

Một cạm bẫy khác là giả định rằng thực tế là bạn có thể làm một cái gì đó bằng Java một cách dễ dàng / độc đáo như bạn có thể / có thể trong C #. Nó không phải là sự thật. Java là một ngôn ngữ cũ hơn nhiều và các lỗi đã được thực hiện ...

Và cạm bẫy cuối cùng là nghĩ rằng phàn nàn về những thứ bị thiếu / khác nhau trong Java trên SO sẽ giúp bạn có được những phản hồi thông cảm / hỗ trợ toàn cầu!


3

Coi chừng sự khác biệt trong các sửa đổi truy cập mặc định. Cũng lưu ý rằng tất cả các phương thức không tĩnh trong Java là ảo (trừ khi bạn đánh dấu chúng là cuối cùng).

Mặc dù nó đã lỗi thời nhưng tôi thấy đây là một tài liệu tham khảo tuyệt vời.

So sánh C # và Java, bởi Dare Obasanjo


3
Also note that all non-static methods in Java are virtual.Tôi ước gì C # cũng như thế này
Graphain

3
Tôi mừng vì không phải vậy, vì nó phá hủy lý do của OOP. Với mọi phương thức là ảo theo mặc định, về cơ bản bạn cho phép cả lớp của bạn được thay thế, điều mà bạn thường không muốn. Ngoài ra, thay đổi một phương thức từ không cuối cùng sang cuối cùng có thể phá vỡ mã dẫn xuất, trong khi cách khác thì không.
Femaref


0

Tôi nghĩ rằng câu hỏi của bạn là chủ quan. Tất cả không thể được giải thích ở đây. Tôi đề nghị bạn đọc Java Puzzlers , By Joshua Bloch and Neal Gafter. Bạn có thể tìm hiểu thêm và được an toàn từ những cạm bẫy.


không phải tất cả các cạm bẫy, nhưng các cạm bẫy mà lập trình viên C # có thể tạo ra, trong Java :)
Vimvq1987

1
@ Vimvq1987 - không có lý do gì để cho rằng bạn sẽ không gặp phải những cạm bẫy "Java Puzzlers" sau khi chuyển sang Java.
Stephen C

-1

Trong ngôn ngữ Java, các mục tiêu tương đương của các kiểu nguyên thủy như int, char, không phải là "các loại giá trị" (ví dụ: Integer là một kiểu tham chiếu). Trong C #, System.Int32 là một cấu trúc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.