CodeGym /Blog Java /Ngẫu nhiên /Bị kẹt? Những phần khó nhất khi học Java và cách vượt qua...
John Squirrels
Mức độ
San Francisco

Bị kẹt? Những phần khó nhất khi học Java và cách vượt qua chúng

Xuất bản trong nhóm
Như bạn đã biết, chúng tôi khuyên những người mới bắt đầu viết mã nên bắt đầu học ngôn ngữ lập trình với Java và CodeGym có mọi thứ để làm cho quá trình học Java trở nên dễ hiểu ngay cả đối với những sinh viên chưa được chuẩn bị kỹ lưỡng nhất. Nhưng cũng như các yếu tố trò chơi hóa, câu chuyện dễ hiểu và các nhân vật vui nhộn giúp giảm bớt quá trình này, việc học các nguyên tắc cơ bản của Java một cách đầy đủ nhất hiếm khi không có thách thức đối với phần lớn những người mới học. Bị kẹt?  Những phần khó nhất khi học Java và cách vượt qua chúng - 1Hôm nay chúng ta sẽ xem xét một số lĩnh vực khó khăn nhất trong các nguyên tắc cơ bản về lập trình Java, cố gắng hiểu tại sao nhiều người cảm thấy chúng khó khăn và liệu có điều gì đó để bạn làm với nó không.

1. Thuốc gốc

Generics trong Java là các loại có tham số. Khi tạo một kiểu chung, bạn chỉ định không chỉ một kiểu mà còn cả kiểu dữ liệu mà nó sẽ làm việc. Generics thường được những người học Java đề cập đến là một trong những phần khó hiểu nhất của Java đối với họ. “Vấn đề chính của tôi vẫn là xử lý Generics. Sẽ dễ dàng hơn nhiều khi bạn có các phương thức với các tham số để tuân theo, nhưng sẽ trở nên khó hiểu khi bạn phải viết của riêng mình,” một người học Java ẩn danh cho biết.

Mẹo và khuyến nghị

Đây là ý kiến ​​về Generics trong Java từ Ravi Reddy, một lập trình viên giàu kinh nghiệm và là giáo sư đại học: “Java Generics làm được một điều mà các mẫu C++ không làm được — triển khai an toàn kiểu. Việc triển khai các mẫu C++ là một thủ thuật tiền xử lý đơn giản và không đảm bảo an toàn cho kiểu. Generics trong Java giống như các mẫu C++ nhưng có thêm kiểu an toàn. Và IMHO, loại an toàn là một tính năng thiết yếu của bất kỳ môi trường phát triển tốt nào. Và vâng! Chúng có thể gây nhầm lẫn vì sự thay đổi tinh thần của chúng ta giữa các tham số và các loại. Nhưng tôi tin rằng việc dành thời gian để thành thạo chúng rất đáng để nỗ lực. Bởi vì tôi thấy mình "suy nghĩ" tốt hơn nhiều về Java khi tôi đã hiểu về giao diện và Generics."

2. Đa luồng

Đa luồng trong Java là một quá trình thực hiện đồng thời hai hoặc nhiều luồng để đạt được mức sử dụng CPU tối đa của ứng dụng. Đa luồng giải quyết các nhiệm vụ rất quan trọng và có thể làm cho các chương trình của chúng tôi nhanh hơn. Thường nhanh hơn nhiều lần. Nhưng nó được coi là một trong những chủ đề mà nhiều người mới học Java có xu hướng mắc kẹt. Tất cả chỉ vì đa luồng cũng có thể tạo ra vấn đề thay vì giải quyết chúng. Có hai vấn đề cụ thể mà đa luồng có thể tạo ra: bế tắc và điều kiện chủng tộc. Bế tắc là tình huống trong đó nhiều luồng đang chờ tài nguyên do nhau nắm giữ và không có luồng nào có thể tiếp tục chạy. Điều kiện tương tranh là lỗi thiết kế trong một hệ thống hoặc ứng dụng đa luồng, trong đó hoạt động của hệ thống hoặc ứng dụng phụ thuộc vào thứ tự thực thi các phần của mã.

Mẹo và khuyến nghị

Đây là một khuyến nghị tốtvề cách xử lý đa luồng từ S.Lott, một kiến ​​trúc sư phần mềm và người dùng tích cực của StackExchange, một trang web hỏi đáp phổ biến: “Đa luồng rất đơn giản. Mã hóa một ứng dụng cho đa luồng là rất, rất dễ dàng. Có một mẹo đơn giản và đây là sử dụng hàng đợi tin nhắn được thiết kế tốt (không cuộn của riêng bạn) để truyền dữ liệu giữa các luồng. Phần khó là cố gắng để nhiều luồng cập nhật một đối tượng được chia sẻ một cách kỳ diệu theo một cách nào đó. Đó là khi nó dễ bị lỗi vì mọi người không chú ý đến các điều kiện cuộc đua hiện có. Nhiều người không sử dụng hàng đợi tin nhắn và cố gắng cập nhật các đối tượng được chia sẻ và tạo ra sự cố cho chính họ. Điều trở nên khó khăn là thiết kế một thuật toán hoạt động tốt khi truyền dữ liệu giữa một số hàng đợi. Đó là khó khăn.

3. Các vấn đề về đường dẫn lớp

Lỗi đường dẫn lớp cũng được coi là một trong những vấn đề bị phàn nàn nhiều nhất mà các nhà phát triển Java đang gặp phải trong công việc hàng ngày của họ. “Các sự cố về đường dẫn lớp có thể tốn nhiều thời gian để gỡ lỗi và có xu hướng xảy ra vào những thời điểm và địa điểm tồi tệ nhất có thể: trước khi phát hành và thường là trong các môi trường mà nhóm phát triển có ít hoặc không có quyền truy cập. Vasco Ferreira, một nhà phát triển Java/Javascript có kinh nghiệm và là tác giả của các hướng dẫn liên quan đến lập trình , cho biết chúng cũng có thể xảy ra ở cấp độ IDE và trở thành nguyên nhân làm giảm năng suất .

Mẹo và khuyến nghị

“Các vấn đề về đường dẫn lớp không phải ở mức độ thấp hoặc không thể tiếp cận như lúc đầu chúng có vẻ như vậy. Đó là tất cả về các tệp zip (lọ) hiện diện/không hiện diện trong một số thư mục nhất định, cách tìm các thư mục đó và cách gỡ lỗi đường dẫn lớp trong môi trường có quyền truy cập hạn chế. Bằng cách biết một tập hợp giới hạn các khái niệm như Trình tải lớp, Chuỗi trình tải lớp và chế độ Parent First / Parent Last, những vấn đề này có thể được giải quyết một cách hiệu quả,” chuyên gia giải thích.

4. Đa hình và sử dụng nó một cách chính xác

Khi nói đến các nguyên tắc của OOP, nhiều người nói rằng họ gặp khó khăn trong việc hiểu tính đa hình. Tính đa hình là khả năng của chương trình xử lý các đối tượng có cùng giao diện theo cùng một cách mà không cần thông tin về loại cụ thể của đối tượng. Mặc dù Đa hình là một chủ đề khá cơ bản, nhưng nó khá rộng và là một phần tốt trong nền tảng của Java. Đối với nhiều sinh viên, tính đa hình là khó khăn đầu tiên khi học Java. Tất cả là vì có nhiều dạng đa hình khác nhau được sử dụng trong các ngữ cảnh khác nhau, điều này có thể gây nhầm lẫn.

Mẹo và khuyến nghị

Không có cách nào khác để đối phó với tính đa hình ngoài việc học nó. Đây là cách Torben Mogensen, người dạy lập trình tại Đại học Copenhagen, giải thíchkhái niệm này: “Nạp chồng đơn giản: + có thể có nghĩa là cả phép cộng số nguyên, phép cộng dấu phẩy động và phép nối chuỗi (trong một số ngôn ngữ). Đa hình kiểu con: Nếu B là một kiểu con của (kế thừa từ) A, thì bất kỳ giá trị nào của kiểu B đều có thể được sử dụng trong ngữ cảnh mong đợi một giá trị kiểu A. Đa hình tham số: Một kiểu có thể được tham số hóa với các tham số kiểu, chẳng hạn như bạn các bối cảnh khác nhau có thể cung cấp các đối số kiểu khác nhau, vì vậy bạn khởi tạo kiểu được tham số hóa thành các kiểu cụ thể khác nhau. Đây còn được gọi là "mẫu" hoặc "thuốc chung" và có trong các ngôn ngữ hướng đối tượng thường được chỉ định bằng cách sử dụng dấu ngoặc nhọn (chẳng hạn như T<A>). Giao diện đa hình. Về cơ bản, đây là một cơ chế trong đó bạn hạn chế tính đa hình của kiểu con đối với các kiểu con triển khai một giao diện nhất định hoặc tính đa hình tham số để nhập các tham số triển khai một giao diện nhất định.”

5. Hồi tưởng

Reflection là một cơ chế để khám phá dữ liệu về một chương trình trong khi nó đang chạy. Sự phản chiếu cho phép bạn khám phá thông tin về các trường, phương thức và hàm tạo của lớp. Nó cũng cho phép bạn làm việc với các loại không có trong thời gian biên dịch, nhưng có sẵn trong thời gian chạy. Phản ánh và một mô hình nhất quán hợp lý để đưa ra thông tin lỗi giúp tạo mã động chính xác. Nhưng đối với nhiều người, không dễ để tìm ra cách sử dụng Reflection.

Mẹo và khuyến nghị

“Trong trường hợp phản chiếu và Java, sự phản chiếu cho phép Java, được thiết kế để nhập tĩnh, được nhập động. Gõ động không phải là xấu. Có, nó cho phép lập trình viên phá vỡ một số nguyên tắc OOP nhất định, nhưng đồng thời nó cho phép nhiều tính năng mạnh mẽ như ủy quyền thời gian chạy và nội xạ phụ thuộc. Có, Java cho phép bạn tự bắn vào chân mình bằng phản xạ. Tuy nhiên, bạn phải chĩa súng vào chân mình một cách rõ ràng, tháo chốt an toàn và bóp cò,” Jayesh Lalwani, một kiến ​​trúc sư ứng dụng và lập trình viên Java có kinh nghiệm giải thích .

6. Luồng vào/ra

Luồng cho phép bạn làm việc với bất kỳ nguồn dữ liệu nào: Internet, hệ thống tệp trên máy tính của bạn hoặc thứ gì đó khác. Luồng là một công cụ phổ quát. Chúng cho phép chương trình nhận dữ liệu từ bất kỳ đâu (luồng đầu vào) và gửi dữ liệu đến bất kỳ đâu (luồng đầu ra). Nhiệm vụ của họ là như nhau: lấy dữ liệu từ một nơi và gửi nó đến một nơi khác. Có hai loại luồng: luồng đầu vào (được sử dụng để nhận dữ liệu) và luồng đầu ra (để gửi dữ liệu). Điều khiến nhiều người khó hiểu khi sử dụng luồng là thực tế là Java có nhiều lớp luồng I/O.

Mẹo và khuyến nghị

“Java có rất nhiều lớp luồng I/O chủ yếu là do hai yếu tố góp phần. Đầu tiên là di sản. Một số lớp vẫn còn đó vì lý do lịch sử và chúng không bị phản đối vì chúng không bị coi là có hại. Thứ hai, tính linh hoạt. Các ứng dụng khác nhau có các yêu cầu khác nhau và do đó, bạn có nhiều tùy chọn tùy thuộc vào yêu cầu của mình. Jonas Mellin, một chuyên gia Java đến từ Thụy Điển, cho biết : Các khái niệm trừu tượng hữu ích mang lại sự rõ ràng khi bạn đọc nó và với một vài dòng mã, bạn có thể làm được rất nhiều việc. Khía cạnh nào của Java mà bạn thấy khó hiểu nhất hoặc bị mắc kẹt trong một thời gian? Chia sẻ kinh nghiệm của bạn trong các ý kiến.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION