tek4

Tính tổng quát hóa trong Java

by - September. 26, 2021
Kiến thức
Học
Công nghệ
<p>Trong b&agrave;i viết n&agrave;y, ch&uacute;ng ta sẽ t&igrave;m hiểu về t&iacute;nh tổng qu&aacute;t h&oacute;a trong Java, c&aacute;ch tạo c&aacute;c lớp v&agrave; phương thức tổng qu&aacute;t v&agrave; những ưu điểm c&ugrave;ng với c&aacute;c v&iacute; dụ dẫn chứng.</p> <p>T&iacute;nh tổng qu&aacute;t h&oacute;a cho ph&eacute;p ch&uacute;ng ta tạo một lớp, giao diện v&agrave; phương thức duy nhất c&oacute; thể được sử dụng với nhiều loại dữ liệu hoặc đối tượng kh&aacute;c nhau. Điều n&agrave;y gi&uacute;p ch&uacute;ng ta c&oacute; thể t&aacute;i sử dụng c&aacute;c đoạn m&atilde; của m&igrave;nh.</p> <p><strong>Ch&uacute; &yacute;: T&iacute;nh tổng qu&aacute;t h&oacute;a sẽ kh&ocirc;ng hoạt động hiệu quả với c&aacute;c kiểu dữ liệu căn bản như int, float, char.</strong></p> <h2>Lớp tổng qu&aacute;t</h2> <p>Ch&uacute;ng ta c&oacute; thể tạo một lớp c&oacute; thể được sử dụng với bất kỳ loại dữ liệu n&agrave;o. Một lớp như vậy được gọi l&agrave; lớp tổng qu&aacute;t.</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>class Main { public static void main(String[] args) { lop_A&lt;Integer&gt; a = new lop_A&lt;&gt;(100); System.out.println(a.get()); lop_A&lt;String&gt; b = new lop_A&lt;&gt;("Lap trinh Java"); System.out.println(b.get()); } } class lop_A&lt;T&gt; { private T thuoc_tinh; public lop_A(T thuoc_tinh) { this.thuoc_tinh = thuoc_tinh; } public T get() { return this.thuoc_tinh; } }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>100 Lap trinh Java</code></pre> <p>Trong v&iacute; dụ tr&ecirc;n, ch&uacute;ng ta đ&atilde; tạo một lớp tổng qu&aacute;t c&oacute; t&ecirc;n l&agrave; lop_A. Lớp n&agrave;y c&oacute; thể được sử dụng để l&agrave;m việc với bất kỳ loại dữ liệu n&agrave;o. Ở đ&acirc;y, T được sử dụng b&ecirc;n trong dấu ngoặc nhọn &lt;&gt; nhằm cho biết kiểu dữ liệu. B&ecirc;n trong lớp Main, ch&uacute;ng ta đ&atilde; tạo hai đối tượng l&agrave; a v&agrave; b của lớp tổng qu&aacute;t:</p> <ul> <li>Đối tượng a &ndash; T sẽ được thay thế bằng Integer. V&agrave; lớp tổng qu&aacute;t lop_A sẽ l&agrave;m việc với dữ liệu kiểu số nguy&ecirc;n.</li> <li>Đối tượng b - T sẽ được thay thế bằng String. V&agrave; lớp tổng qu&aacute;t lop_A sẽ l&agrave;m việc với dữ liệu kiểu chuỗi k&yacute; tự.</li> </ul> <h2>C&aacute;c phương thức tổng qu&aacute;t</h2> <p>Tương tự với c&aacute;c lớp tổng qu&aacute;t, ch&uacute;ng ta cũng c&oacute; thể tạo một phương thức c&oacute; thể được sử dụng với bất kỳ loại dữ liệu n&agrave;o. Một phương thức như vậy được gọi l&agrave; Phương thức tổng qu&aacute;t.</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>class Main { public static void main(String[] args) { lop_A a = new lop_A(); a.&lt;String&gt;phuong_thuc_A("Lap trinh Java"); a.&lt;Float&gt;phuong_thuc_A(100f); } } class lop_A { public &lt;T&gt; void phuong_thuc_A(T du_lieu) { System.out.println(du_lieu); } }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Lap trinh Java 100.0</code></pre> <p>Trong v&iacute; dụ tr&ecirc;n, ch&uacute;ng ta đ&atilde; tạo một phương thức tổng qu&aacute;t c&oacute; t&ecirc;n l&agrave; phuong_thuc_A. Ở đ&acirc;y, tham số &lt;T&gt; được ch&egrave;n v&agrave;o sau từ public v&agrave; trước kiểu trả về l&agrave; void. Ch&uacute;ng ta c&oacute; thể gọi phương thức tổng qu&aacute;t bằng c&aacute;ch đặt kiểu dữ liệu l&agrave; &lt;String&gt; v&agrave; &lt;Float&gt; b&ecirc;n trong dấu ngoặc v&agrave; trước t&ecirc;n phương thức.</p> <p><strong>Ch&uacute; &yacute;: Ch&uacute;ng ta cũng c&oacute; thể gọi phương thức tổng qu&aacute;t m&agrave; kh&ocirc;ng cần th&ecirc;m tham số cho kiểu dữ liệu.</strong></p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>a.phuong_thuc_A("Lap trinh Java");</code></pre> <p>Trong trường hợp n&agrave;y, tr&igrave;nh bi&ecirc;n dịch sẽ tự so s&aacute;nh với tham số cho kiểu dữ liệu dựa tr&ecirc;n gi&aacute; trị được truyền cho phương thức.</p> <h2>C&aacute;c kiểu dữ liệu bị giới hạn</h2> <p>Tham số cho kiểu dữ liệu c&oacute; thể chấp nhận bất kỳ kiểu dữ liệu n&agrave;o (ngoại trừ kiểu dữ liệu căn bản như int, float hay double). Tuy nhi&ecirc;n, nếu ch&uacute;ng ta chỉ muốn sử dụng một số kiểu dữ liệu cụ thể (chẳng hạn như chỉ chấp nhận dữ liệu kiểu số), th&igrave; ch&uacute;ng ta c&oacute; thể sử dụng c&aacute;c kiểu dữ liệu được giới hạn.</p> <p>Trong trường hợp c&aacute;c kiểu dữ liệu bị r&agrave;ng buộc, ch&uacute;ng ta sẽ sử dụng từ kh&oacute;a <strong>extends</strong>.</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>&lt;T extends A&gt;</code></pre> <p>Điều n&agrave;y c&oacute; nghĩa l&agrave; T chỉ c&oacute; thể chấp nhận kiểu dữ liệu l&agrave; c&aacute;c kiểu dữ liệu con của A.</p> <pre class="language-java"><code>class lop_A &lt;T extends Number&gt; { public void in_thong_tin() { System.out.println("Chi lam viec voi kieu du lieu so!"); } } class Main { public static void main(String[] args) { lop_A&lt;String&gt; a = new lop_A&lt;&gt;(); } }</code></pre> <p>Kết quả sẽ trả về l&agrave; lỗi được th&ocirc;ng b&aacute;o. Trong v&iacute; dụ tr&ecirc;n, ch&uacute;ng ta đ&atilde; tạo một lớp c&oacute; t&ecirc;n l&agrave; lop_A.</p> <pre class="language-markup"><code>T extends Number</code></pre> <p>Ở đ&acirc;y, lớp tổng qu&aacute;t được khởi tạo với kiểu dữ liệu được giới hạn. Điều n&agrave;y c&oacute; nghĩa l&agrave; lớp tổng qu&aacute;t chỉ c&oacute; thể l&agrave;m việc với c&aacute;c kiểu dữ liệu l&agrave; con của Number v&iacute; dụ như Integer, Double. Tuy nhi&ecirc;n, ch&uacute;ng ta lại tạo một đối tượng của lớp tổng qu&aacute;t với kiểu dữ liệu l&agrave; String. Trong trường hợp n&agrave;y, tr&igrave;nh bi&ecirc;n dịch sẽ th&ocirc;ng b&aacute;o lỗi.</p> <h2>Lợi &iacute;ch của t&iacute;nh tổng qu&aacute;t h&oacute;a trong Java</h2> <p><em>1. Khả năng t&aacute;i sử dụng c&aacute;c đoạn m&atilde;</em></p> <p>Với sự trợ gi&uacute;p của t&iacute;nh tổng qu&aacute;t h&oacute;a trong Java, ch&uacute;ng ta c&oacute; thể viết đoạn m&atilde; m&agrave; c&oacute; thể hoạt động với c&aacute;c loại dữ liệu kh&aacute;c nhau.</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>public &lt;T&gt; void phuong_thuc(T du_lieu) {...}</code></pre> <p>Ở đ&acirc;y, ch&uacute;ng ta đ&atilde; tạo ra một phương thức tổng qu&aacute;t. Phương thức n&agrave;y c&oacute; thể được sử dụng lại để thực hiện c&aacute;c thao t&aacute;c với kiểu dữ liệu số nguy&ecirc;n, dữ liệu kiểu chuỗi k&yacute; tự.</p> <p><em>2. Kiểm tra kiểu thời gian bi&ecirc;n dịch</em></p> <p>Tham số kiểu dữ liệu của phương thức tổng qu&aacute;t sẽ cung cấp c&aacute;c th&ocirc;ng tin về loại dữ liệu được sử dụng trong đoạn m&atilde; tổng qu&aacute;t.</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>lop_A&lt;Integer&gt; a = new lop_A&lt;&gt;();</code></pre> <p>Ở đ&acirc;y, ch&uacute;ng ta biết rằng lớp tổng qu&aacute;t lop_A chỉ hoạt động với dữ liệu kiểu số nguy&ecirc;n. B&acirc;y giờ, nếu ch&uacute;ng ta cố gắng truyền dữ liệu kh&ocirc;ng phải l&agrave; kiểu số nguy&ecirc;n, chương tr&igrave;nh sẽ tạo ra lỗi tại thời điểm bi&ecirc;n dịch.</p> <p><em>3. Được sử dụng với c&aacute;c tập hợp</em></p> <p>Collections Framework sử dụng kh&aacute;i niệm tổng qu&aacute;t trong Java.</p> <p>V&iacute; dụ:</p> <pre class="language-java"><code>ArrayList&lt;String&gt; a = new ArrayList&lt;&gt;(); ArrayList&lt;Float&gt; b = new ArrayList&lt;&gt;();</code></pre> <p>Trong v&iacute; dụ tr&ecirc;n, ch&uacute;ng ta đ&atilde; sử dụng c&ugrave;ng một lớp ArrayList để l&agrave;m việc với c&aacute;c kiểu dữ liệu kh&aacute;c nhau. Tương tự như ArrayList, c&aacute;c tập hợp kh&aacute;c như LinkedList, Queue, Maps cũng c&oacute; t&iacute;nh tổng qu&aacute;t trong Java.</p> <p>Tr&ecirc;n đ&acirc;y l&agrave; kh&aacute;i niệm v&agrave; v&iacute; dụ cơ bản về t&iacute;nh tổng qu&aacute;t h&oacute;a trong Java. Hy vọng mọi người c&oacute; thể &aacute;p dụng v&agrave;o trong chương tr&igrave;nh của m&igrave;nh. Mọi người h&atilde;y tiếp tục theo d&otilde;i c&aacute;c b&agrave;i tiếp theo v&agrave; cập nhật c&aacute;c b&agrave;i mới nhất tr&ecirc;n <a href="http://tek4.vn">tek4</a> nh&eacute;!</p>