Java

Duyệt các bài viết được gắn thẻ Java

106 bài viết

Tính đa hình trong Java là gì?

Tính đa hình trong Java là gì?

Tính đa hình (polymorphism) trong Java cho phép các đối tượng thể hiện nhiều hành vi khác nhau dựa trên ngữ cảnh sử dụng. Bài viết này của Station D sẽ giải thích khái niệm tính đa hình trong Java, các phương thức đạt được tính đa hình, phân loại và lý do sử dụng nó trong lập trình hướng đối tượng. Tính đa hình (polymorphism) trong Java là gì? Tính đa hình là khả năng của các đối tượng thuộc các lớp có quan hệ kế thừa với nhau thể hiện nhiều hành vi khác nhau khi được gọi thông qua cùng một giao diện. Trong Java , tính đa hình cho phép xử lý đối tượng con thông qua tham chiếu đến lớp cha của chúng. Khi gọi phương thức trên đối tượng con thông qua tham chiếu lớp cha, phiên bản phương thức được thực thi sẽ phụ thuộc vào kiểu của đối tượng thực tế. Tính đa hình là gì? Tính đa hình là một trong những tính chất quan trọng của lập trình hướng đối tượng, cho phép các đối tượng có nhiều dạng (poly) và chức năng (morph) khác nhau. Nó cho phép một giao diện được thực hiện theo nhiều cách khác nhau. Một lệnh gọi trên một tham chiếu đối tượng sẽ thực thi hành vi phù hợp với kiểu của đối tượng được tham chiếu tới. Tính đa hình trong Java là gì? Trong Java, tính đa hình cho phép xác định một giao diện chung cho một nhóm các đối tượng có liên quan, sau đó ghi đè hoặc cài đặt các phiên bản cụ thể của các phương thức cho mỗi lớp con đại diện cho một loại cụ thể. Java cung cấp 2 cơ chế để đạt được...

By stationd
Cập nhật các tính năng mới trong Java 20

Cập nhật các tính năng mới trong Java 20

Java 20 là một bản phát hành quan trọng của nền tảng ngôn ngữ lập trình Java , được phát hành vào tháng 3 năm 2023. Bản phát hành này bao gồm một loạt các tính năng mới và cải tiến giúp nâng cao hiệu suất, bảo mật và khả năng sử dụng của ngôn ngữ. Hãy cùng tìm hiểu về các tính năng mới trong Java 20 và cách sử dụng chúng để phát triển các ứng dụng hiệu quả. Tổng quan về Java 20 Java 20 là phiên bản tiếp theo của Java 11, được phát hành vào năm 2018. Nó là một bản phát hành dài hạn (LTS) và sẽ được hỗ trợ trong 8 năm. Điều này có nghĩa là các nhà phát triển có thể yên tâm sử dụng Java 20 trong dự án của họ trong một thời gian dài mà không cần phải lo lắng về việc nâng cấp phiên bản. Với Java 20, Oracle đã tập trung vào việc cải thiện hiệu suất, bảo mật và khả năng sử dụng của ngôn ngữ. Bản phát hành này cũng bao gồm một số tính năng mới và cải tiến để giúp các nhà phát triển viết mã dễ dàng hơn và tối ưu hóa quá trình phát triển. Các tính năng mới trong Java 20 Cải thiện hiệu suất GIGO (Garbage-In Garbage-Out) Một trong những tính năng mới đáng chú ý trong Java 20 là thuật toán thu gom rác mới có tên là GIGO (Garbage-In Garbage-Out). Thuật toán này giúp cải thiện hiệu suất thu gom rác và giảm độ trễ trong quá trình chạy của ứng dụng. Thuật toán GIGO hoạt động bằng cách loại bỏ các đối tượng không sử dụng khỏi bộ nhớ ngay khi chúng được tạo ra,...

By stationd
Java là gì? Tổng quan về ngôn ngữ lập trình Java

Java là gì? Tổng quan về ngôn ngữ lập trình Java

Java là ngôn ngữ lập trình thuộc top phổ biến nhất thế giới, Java không chỉ phổ biến trong lập trình ứng dụng web và di động mà còn là xương sống của nhiều hệ thống lớn như các nền tảng giao dịch tài chính, hệ thống quản lý doanh nghiệp, và các ứng dụng nhúng. Vậy Java là gì? Java hoạt động ra sao và ứng dụng như thế nào? Cùng Station D tìm hiểu tổng quan về ngôn ngữ lập trình Java này thông qua bài viết bên dưới nhé! Java là gì? Java là một trong những ngôn ngữ lập trình hướng đối tượng. Ngôn ngữ Java được sử dụng phổ biến trong phát triển phần mềm, trang web, game hay ứng dụng trên các thiết bị di động. Java được khởi đầu bởi James Gosling và bạn đồng nghiệp ở Sun MicroSystem năm 1991. Ban đầu Java được tạo ra nhằm mục đích viết phần mềm cho các sản phẩm gia dụng, và có tên là Oak. Java được chính thức phát hành năm 1994, đến năm 2010 được Oracle mua lại từ Sun MicroSystem. Java được thiết kế với tiêu chí “ Write Once, Run Anywhere ” (viết một lần, chạy mọi nơi), tức là mã nguồn Java sau khi biên dịch có thể chạy trên bất kỳ nền tảng nào hỗ trợ Java Virtual Machine (JVM), mà không cần thay đổi lại mã. Điều này giúp Java trở thành một ngôn ngữ lập trình đa nền tảng và rất phổ biến. Tham khảo thêm về công việc của Java developer tại đây Đặc điểm của ngôn ngữ lập trình Java là gì? Nguồn ảnh: ScholarHat Tương tự C++, hướng đối tượng hoàn toàn Trong quá trình tạo ra một ngôn ngữ mới phục vụ...

By stationd
Cách xây dựng ThreadLocal trong Java

Cách xây dựng ThreadLocal trong Java

Bài viết được sự cho phép của tác giả Trần Văn Dem ThreadLocal là một công cụ rất mạnh mẽ của Java Concurrent . Nó cung cấp API để lưu data trên từng Thread , các Thread tự quản lý data của mình. Khi cần dùng thì không cần phải khởi tạo lại dữ liệu mà có thể lấy ra dùng trực tiếp mà không cần khởi tạo lại đối tượng từ đó giúp tiết kiệm thời gian. Chúng ta thường hay sử dụng các loại API sau : public T get() : dùng để lấy dữ liệu lưu trong Thread . public void set(T value) : dùng để lưu dữ liệu vào Thread . Tuy nhiên sau khi đọc code của Java tôi nhận thấy ThreadLocal không tối ưu cho 2 loại API này. Cụ thể tôi đã search trên mạng và thấy một bài khá hay về FastThreadLocal của netty . Tránh lỗi ConcurrentModificationException trong Java như thế nào? Hướng dẫn Java Design Pattern – Object Pool Phân tích API của ThreadLocal. Các bạn tham khảo tại link sau. Dưới đây tôi xin giải thích đơn giản như sau. Đầu tiên hãy phân tích hàm set của Java . public void set (T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null ) map.set( this , value); else createMap(t, value); } ThreadLocalMap getMap (Thread t) { return t.threadLocals; } /** * Set the value associated with key. * * @param key the thread local object * @param value the value to be set */ private void set (ThreadLocal<?> key, Object value) { // We don't use a fast path as with get() because it is at // least as common to use set() to create new entries as // it is to replace...

By stationd
React Redux: Redux middleware là gì?

React Redux: Redux middleware là gì?

Bài viết được sự cho phép của tác giả Phạm Minh Khoa Để hiểu rõ hơn khái niệm Redux middleware , chúng ta cùng thử xử lý 1 bài toán như sau: Bạn cần phải ngăn chặn người dùng (users) không được sử dụng các từ khóa bị cấm (ví dụ như vl, vkl, cmnr, …) trong bài viết của họ. Để đơn giản thì mình sẽ xử lý lúc người dùng submit bài viết (trong ví dụ sẽ chỉ check trong tiêu đề bài viết thôi nhé) handleSubmit(event) { event.preventDefault(); const { title } = this.state; this.props.addArticle({ title }); this.setState({ title: "" }); } Việc kiểm tra tất nhiên sẽ được đặt trước dòng this.props.addArticle và nó sẽ kiểu như này: handleSubmit(event) { event.preventDefault(); const { title } = this.state; const forbiddenWords = ['spam', 'money']; const foundWord = forbiddenWords.filter(word => title.includes(word) ) if (foundWord) { return this.props.titleForbidden(); } this.props.addArticle({ title }); this.setState({ title: "" }); } Việc làm như này tất nhiên cũng chẳng sao, tuy nhiên trong đoạn code trên chứa phần xử lý logic (business logic) và nó nằm trong UI Component; thế là không đạt được mục đích của Redux là chuyển logic ra khỏi React Component rồi. Redux middleware sinh ra để giải quyết bài toán trên cho mọi người. Hiểu 1 cách đơn giản thì Redux middleware cho phép chúng ta can thiệp vào giữa thời điểm dispatch 1 action và thời điểm action đến được reducer. Bạn có thể nhìn flow dưới đây để dễ hình dung. Redux vận hành như thế nào Redux middleware là 1 function trả về 1 function, nhận next như 1 tham số. Bên trong function sẽ trả về 1 function khác nhận action như 1 tham số và cuối cùng là trả về next(action). Nó sẽ giống...

By stationd
Hướng dẫn Java Design Pattern – Decorator

Hướng dẫn Java Design Pattern – Decorator

Bài viết được sự cho phép của tác giả Giang Phan Một trong những khía cạnh quan trọng nhất trong quá trình phát triển một ứng dụng mà các lập trình viên phải đối đầu là sự thay đổi. Khi muốn thêm hoặc loại bỏ một tính năng của một đối tượng, điều đầu tiên chúng ta nghĩ đến là thừa kế (extends). Tuy nhiên, thừa kế không khả thi vì nó là static, chúng ta không thể thêm các lớp con mới vào một chương trình khi nó đã được biên dịch và thực thi. Để giải quyết vấn đề này, chúng ta có thể sử dụng Decorator Pattern được giới thiệu trong phần tiếp theo của bài viết này. Decorator Pattern là gì? Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. Decorator pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern). Nó cho phép người dùng thêm chức năng mới vào đối tượng hiện tại mà không muốn ảnh hưởng đến các đối tượng khác. Kiểu thiết kế này có cấu trúc hoạt động như một lớp bao bọc (wrap) cho lớp hiện có. Mỗi khi cần thêm tính năng mới, đối tượng hiện có được wrap trong một đối tượng mới (decorator class). Decorator pattern sử dụng composition thay vì inheritance (thừa kế) để mở rộng đối tượng. Decorator pattern còn được gọi là Wrapper hay Smart Proxy . Tìm Java job lương cao trên Station D ngay! Cài đặt Decorator Pattern như thế nào? Decorator pattern hoạt động dựa trên một đối tượng đặc biệt, được gọi là decorator (hay wrapper). Nó có cùng một interface như một đối tượng mà nó cần bao bọc (wrap), vì vậy phía client sẽ không nhận thấy...

By stationd
Hướng dẫn sử dụng thư viện Jackson

Hướng dẫn sử dụng thư viện Jackson

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh Trong các bài trước, chúng ta đã tìm hiệu về thư viện Gson để chuyển đổi từ đối tượng Java sang JSON và từ JSON sang đối tượng Java. Trong bài này, tôi sẽ hướng dẫn bạn sử dụng thư viện Jackson , một thư viện mã nguồn mở miễn phí rất mạnh mẽ được sử dụng trong nhiều ứng dụng Java. Giới thiệu Jackson là một thư viện Java chứa rất nhiều chức năng để đọc và xây dựng JSON. Nó có khả năng ràng buộc dữ liệu rất mạnh mẽ và cung cấp một framework để tùy chỉnh quá trình chuyển đối tượng Java sang chuỗi JSON và chuỗi JSON sang đối tượng Java. Tạo JSON từ đối Java Có 3 cách để tạo JSON từ Java: Từ một đối tượng Java Từ cây JsonNode Từ Json Stream Phân tích chuỗi JSON Có 3 cách thường dùng để phân tích chuỗi JSON sang Java: Streaming : sử dụng JsonParser để phân tích cú pháp json. Nó cung cấp các phần tử json như là các token. Sử dụng JsonGenerator để tạo ra json từ chuỗi, số nguyên, boolean, … Tree Traversing : json có thể được đọc thành một JsonNode. Node sau đó có thể đi qua để có được thuộc tính cần thiết. Một cây cũng có thể được tạo ra và sau đó được viết như chuỗi json. Data Binding (liên kết dữ liệu) : sử dụng Annotation để đánh dấu các thuộc tính trên đối tượng (POJO) liên kết với các phần tử của chuỗi JSON. Tham khảo việc làm Java Fresher mới nhất trên Station D! Download thư viện Jackson <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.3</version> </dependency> Các ví dụ Chuyển...

By stationd
Những điểm mới của Java 8 (phần 3: Streams API – tiếp)

Những điểm mới của Java 8 (phần 3: Streams API – tiếp)

Bài viết được sự cho phép của smartjob.vn Streams API trong Java 8 là một bước tiến lớn của ngôn ngữ lập trình Java và liên quan đến nhiều khía cạnh khác nhau, nên chúng tôi cần kéo dài thêm chủ đề này. Nếu bạn là lập trình viên C# trên nền .NET framework vào năm 2008, có thể bạn từng háo hức tìm hiểu LINQ. Từ năm 2014 trở về sau, lập trình viên Java cũng được tận hưởng cảm giác tương tự với Java Streams API. Tôi đã từng rất say mê C#, trong ký ức xưa cũ, tôi tìm tên những nhân viên có chứa từ “Văn” sử dụng cú pháp LINQ: string[] employeeList = {"Nguyễn Văn Còn", "Phạm Văn Đoan", "Nguyễn Văn Minh", "Đoàn Minh Huệ"}; List filteredNames = employeeList.Where(c =&gt; c.Contains("Văn")).ToList(); Giờ đây với Java 8 Streams API: string[] employeeList = {"Nguyễn Văn Còn", "Phạm Văn Đoan", "Nguyễn Văn Minh", "Đoàn Minh Huệ"}; List filteredNames = employeeList.Where(c =&gt; c.Contains("Văn")).ToList(); Sự linh hoạt, hữu dụng của Streams API thể hiện ở số lượng “pattern” rất đa dạng. “pattern” tạm hiểu là cách dùng, cách thức tổ hợp, phối hợp các phương thức để mang đến kết quả mong muốn. Phần nội dung này để trình bày thêm về các “pattern”. Có nhiều cách để khởi tạo dòng nước (stream): // Khởi tạo dòng (stream) từ mảng (array). Arrays.stream(stringArray); // Khởi tạo dòng số nguyên (stream of integer numbers) từ khoảng giá trị. IntStream.range(9, 42); // Khởi tạo dòng (stream) từ List&lt;T&gt; employeeList.stream(); // Khởi tạo dòng nước (stream) từ tập hợp các file. Files.walks(); // Khởi tạo dòng nước (stream) từ Spliterator&lt;T&gt; - Một interface mới trong bộ Collections. java.util.Spliterator() // Khởi tạo dòng (stream) từ tập hợp hữu hạn giá trị. Streams.of("Nguyễn Văn Còn", "Đoàn...

By stationd
Triển khai RPC đơn giản trong java

Triển khai RPC đơn giản trong java

Bài viết được sự cho phép của tác giả Trần Văn Dem Gần đây mọi người hay so sánh REST với RPC nên chọn công nghệ nào để truyền tải dữ liệu qua các server. Với REST chúng ta có thể tìm thấy rất nhiều bài hướng dẫn trên internet. Các bài về tìm hiểu cơ chế chạy, cách truyền dữ liệu thông qua body,… Những bài viết đó khiến chúng ta quá quen thuộc với REST và nó không còn là hộp đen nữa. Trái ngược với điều trên thì RPC lại không nhiều bài viết hướng dẫn mọi người implement, mọi người thường tìm thấy cách sử dụng của một số framework như gRPC, thrift,… và các bài so sánh hiệu năng viết RPC nhanh hơn REST và thích hợp với truyền tải thông tin liên server hơn REST. Tại đây tôi có 1 implement nhỏ đơn giản về RPC hy vọng thông qua bài này mọi người sẽ không còn cảm thấy lạ với loại hình này và có thể giải thích được tại sao nó lại thích hợp giữa các server. Transport Cũng như các hệ thống client-server khác để giao tiếp giữa client và server chúng ta cần một network protocol . Các framework về RPC nổi tiếng họ dùng tầng transport sau: gRPC sử dụng http2 truyền tải dũ liệu dữa client – server . Với Java thì họ dùng netty để dựng server http2. Vì Netty là một Non Blocking IO Framework thrift sử dụng http1.1 truyền tải dữ liệu giữa client-server Trong lúc đi làm tôi thường thấy mọi người hay so sánh giữa http và rpc . Hai khái niệm này không thể so sánh với nhau được vì nó thuộc 2 phạm trù khác nhau. Hy vọng sau bài viết...

By stationd
Functional Interface là gì? Functional Interface API trong Java 8

Functional Interface là gì? Functional Interface API trong Java 8

Bài viết được sự cho phép của tác giả Trần Hữu Cương 1. Functional Interface là gì? Functional Interface là interface có duy nhất 1 method trừu tượng (có thể có thêm các method không trừu tượng bằng từ khóa default trong Java 8) Ví dụ: Comparable là 1 Functional Interface với method trừu tượng duy nhất compareTo ; Runnable là 1 Functional Interface với method trừu tượng duy nhất run … Về annotation @FunctionalInterface: nó được dùng ở trước mỗi interface để khai báo đây là 1 functional interface. @FunctionalInterface public interface Runnable { public abstract void run ( ) ; } Việc dùng annotation @FunctionalInterface là không bắt buộc nhưng nó giúp đảm bảo cho quá trình compile. Ví dụ bạn khai báo @FunctionalInterface nhưng trong interface lại có nhiều hơn 2 method trừu tượng thì nó sẽ báo lỗi. Giới thiệu về GraphQL. Cách giải quyết những hạn chế của RESTful API Refactoring Design Pattern với tính năng mới trong Java 8 2. Functional Interface API trong Java 8 Java 8 xây dựng sẵn một số functional interface và nó được dùng nhiều trong các biểu thức lambda: 2.1. java.util.function.Consumer package java. util . function ; import java. util . Objects ; @FunctionalInterface public interface Consumer<T> { // Phương thức chấp nhận một tham số đầu vào // và không trả về gì cả. void accept ( T t ) ; } consumer thường được dùng với list, stream để xử lý với các phần tử bên trong. Ví dụ: đoạn code dưới đây in ra tất cả các giá trị của 1 list List< String > list = Arrays. asList ( "stack" , "java" , "stackjava.com" ) ; // Sử dụng List.forEach(Consumer) để in ra giá trị của các phần tử trong list list. forEach (...

By stationd
Tìm hiểu về lớp Scanner trong ngôn ngữ lập trình Java

Tìm hiểu về lớp Scanner trong ngôn ngữ lập trình Java

Lớp Scanner trong java là một công cụ quan trọng cho việc đọc dữ liệu đầu vào từ người dùng hoặc các nguồn khác như tệp hoặc luồng. Điều này giúp cho việc nhập liệu trở nên dễ dàng và thuận tiện hơn đối với các lập trình viên. Hãy cùng Station D hiểu rõ hơn về lớp Scanner trong Java qua nội dung bài viết. Cách sử dụng Scanner trong Java Để sử dụng lớp Scanner trong Java , bạn cần import gói java.util và sau đó tạo đối tượng Scanner được liên kết với nguồn dữ liệu. Ví dụ: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // Đọc dữ liệu từ bảng điều khiển } } Bạn cũng có thể liên kết đối tượng Scanner với một tệp hoặc luồng: Scanner scanner = new Scanner(new File("input.txt")); // Đọc dữ liệu từ tệp Scanner scanner = new Scanner(new FileInputStream("input.txt")); // Đọc dữ liệu từ FileInputStream Sau khi tạo đối tượng Scanner, bạn có thể sử dụng các phương thức của lớp này để đọc dữ liệu. Phương thức phổ biến nhất là nextInt(), nextDouble() và nextLine(), lần lượt đọc các số nguyên, số thực và chuỗi ký tự từ nguồn. Xem ngay tin tuyển dụng Java tại Station D Ví dụ về việc sử dụng Scanner trong Java Để minh họa cho việc sử dụng lớp Scanner trong Java, hãy cùng xem xét một ví dụ đơn giản về việc nhập vào thông tin của một sinh viên và hiển thị ra màn hình: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Nhập tên sinh viên: "); String name = scanner.nextLine(); System.out.print("Nhập tuổi sinh viên: "); int age = scanner.nextInt();...

By stationd
Tạo ứng dụng Java RESTful Client với thư viện OkHttp

Tạo ứng dụng Java RESTful Client với thư viện OkHttp

Bài viết được sự cho phép của tác giả Giang Phan Trong các bài viết trước chúng ta sử dụng thư viện Jersey client để gọi các RESTful API. Trong bài này, tôi sẽ giới thiệu với các bạn thư viện khác, rất mạnh mẽ để gọi các RESTful API là OkHttp . Giới thiệu OkHttp OkHttp là một thư viện Java mã nguồn mở, được thiết kế để trở thành một HTTP Client hiệu quả với tốc độ tải nhanh và giảm băng thông đường truyền. Một số đặc điểm nỗi bật của OkHttp: Hỗ trợ Http/2 protocol. Connection pooling : giúp giảm độ trợ của các request. GZIP compression : hỗ trợ nén dữ liệu khi truyền tải. Cache : tránh lặp lại một request nhiều lần. Hỗ trợ synchronous và asynchronous. 10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java 10 tips để trở thành Java Developer xịn hơn Xem thêm nhiều việc làm Java hấp dẫn trên Station D OkHttp được sử dụng để gửi và nhận kết quả từ các ứng dụng Restful web service. Một số thành phần của OkHttp: Request.Builder : hỗ trợ tạo request bao gồm : HTTP Method, header, cookie, media type, … RestClient : chịu trách nhiệm giao tiếp với REST service bao gồm gửi Request và nhận Response. Ví dụ CRUD Restful Client với OkHttp Tạo project Tạo maven project và khai báo dependency sau trong file pom.xml . 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 < project xmlns = " http://maven.apache.org/POM/4.0.0 " xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance " xsi:schemaLocation = " http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd " > < modelVersion >4.0.0</ modelVersion > < groupId...

By stationd