Interface trong Java 🎯
🎯 Mục tiêu: Học cách sử dụng interface để định nghĩa các hành vi chung và tạo ra các lớp có thể triển khai nhiều interface trong Java.
Giới thiệu 📝
Interface là một kiểu dữ liệu trừu tượng trong Java, định nghĩa một tập hợp các phương thức mà một lớp phải triển khai. Interface chỉ chứa các phương thức trừu tượng (từ Java 8 trở lên có thể chứa cả phương thức mặc định và phương thức static).
💡 Fun Fact: Interface giúp chúng ta tạo ra các lớp có thể triển khai nhiều hành vi khác nhau, giúp code linh hoạt và dễ mở rộng hơn.
1. Cú Pháp Cơ Bản ⚡
Interface Đơn Giản
public interface Drawable {
void draw();
void erase();
}
// Lớp triển khai interface
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing circle");
}
@Override
public void erase() {
System.out.println("Erasing circle");
}
}
Interface với Nhiều Phương Thức
public interface Vehicle {
void start();
void stop();
void accelerate();
void brake();
}
public class Car implements Vehicle {
@Override
public void start() {
System.out.println("Starting car");
}
@Override
public void stop() {
System.out.println("Stopping car");
}
@Override
public void accelerate() {
System.out.println("Accelerating car");
}
@Override
public void brake() {
System.out.println("Braking car");
}
}
2. Interface với Phương Thức Mặc Định 🔄
Phương Thức Mặc Định
public interface Payment {
void process(double amount);
default void validateAmount(double amount) {
if (amount <= 0) {
throw new IllegalArgumentException("Amount must be positive");
}
}
}
public class CreditCardPayment implements Payment {
@Override
public void process(double amount) {
validateAmount(amount);
System.out.println("Processing credit card payment: " + amount);
}
}
Ghi Đè Phương Thức Mặc Định
public interface Logger {
default void log(String message) {
System.out.println("Default logging: " + message);
}
}
public class FileLogger implements Logger {
@Override
public void log(String message) {
System.out.println("File logging: " + message);
}
}
3. Interface với Phương Thức Static 🎯
Phương Thức Static
public interface MathOperations {
static int add(int a, int b) {
return a + b;
}
static int subtract(int a, int b) {
return a - b;
}
}
// Sử dụng phương thức static
int sum = MathOperations.add(5, 3);
int difference = MathOperations.subtract(10, 4);
4. Interface với Hằng Số 🔢
Hằng Số Trong Interface
public interface Constants {
double PI = 3.14159;
String DEFAULT_ENCODING = "UTF-8";
int MAX_RETRY_ATTEMPTS = 3;
}
// Sử dụng hằng số
double radius = 5.0;
double area = Constants.PI * radius * radius;
5. Triển Khai Nhiều Interface 🧬
Triển Khai Nhiều Interface
public interface Flyable {
void fly();
}
public interface Swimmable {
void swim();
}
public class Duck implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("Duck is flying");
}
@Override
public void swim() {
System.out.println("Duck is swimming");
}
}
6. Interface Kế Thừa 🔄
Kế Thừa Interface
public interface Animal {
void makeSound();
void move();
}
public interface Pet extends Animal {
void play();
void feed();
}
public class Dog implements Pet {
@Override
public void makeSound() {
System.out.println("Woof!");
}
@Override
public void move() {
System.out.println("Dog is running");
}
@Override
public void play() {
System.out.println("Dog is playing");
}
@Override
public void feed() {
System.out.println("Dog is eating");
}
}
7. Ví Dụ Thực Tế 🚀
Quản Lý Thanh Toán
public interface PaymentMethod {
void processPayment(double amount);
boolean validatePayment();
void refund(double amount);
}
public class CreditCard implements PaymentMethod {
private String cardNumber;
private String expiryDate;
public CreditCard(String cardNumber, String expiryDate) {
this.cardNumber = cardNumber;
this.expiryDate = expiryDate;
}
@Override
public void processPayment(double amount) {
if (validatePayment()) {
System.out.println("Processing credit card payment: " + amount);
}
}
@Override
public boolean validatePayment() {
return cardNumber != null && cardNumber.length() == 16;
}
@Override
public void refund(double amount) {
System.out.println("Refunding to credit card: " + amount);
}
}
public class PayPal implements PaymentMethod {
private String email;
public PayPal(String email) {
this.email = email;
}
@Override
public void processPayment(double amount) {
if (validatePayment()) {
System.out.println("Processing PayPal payment: " + amount);
}
}
@Override
public boolean validatePayment() {
return email != null && email.contains("@");
}
@Override
public void refund(double amount) {
System.out.println("Refunding to PayPal account: " + amount);
}
}
Quản Lý Hệ Thống Logging
public interface Logger {
void log(String message);
void error(String message);
void warn(String message);
default void logWithTimestamp(String message) {
System.out.println("[" + new Date() + "] " + message);
}
}
public class FileLogger implements Logger {
private String filePath;
public FileLogger(String filePath) {
this.filePath = filePath;
}
@Override
public void log(String message) {
System.out.println("File Log: " + message);
}
@Override
public void error(String message) {
System.out.println("File Error: " + message);
}
@Override
public void warn(String message) {
System.out.println("File Warning: " + message);
}
}
public class DatabaseLogger implements Logger {
private String connectionString;
public DatabaseLogger(String connectionString) {
this.connectionString = connectionString;
}
@Override
public void log(String message) {
System.out.println("Database Log: " + message);
}
@Override
public void error(String message) {
System.out.println("Database Error: " + message);
}
@Override
public void warn(String message) {
System.out.println("Database Warning: " + message);
}
}
Quản Lý Hệ Thống Báo Cáo
public interface ReportGenerator {
void generateReport();
void formatReport();
void saveReport(String location);
default void validateReport() {
System.out.println("Validating report...");
}
}
public class PDFReportGenerator implements ReportGenerator {
private String content;
public PDFReportGenerator(String content) {
this.content = content;
}
@Override
public void generateReport() {
System.out.println("Generating PDF report...");
}
@Override
public void formatReport() {
System.out.println("Formatting PDF report...");
}
@Override
public void saveReport(String location) {
System.out.println("Saving PDF report to: " + location);
}
}
public class ExcelReportGenerator implements ReportGenerator {
private String data;
public ExcelReportGenerator(String data) {
this.data = data;
}
@Override
public void generateReport() {
System.out.println("Generating Excel report...");
}
@Override
public void formatReport() {
System.out.println("Formatting Excel report...");
}
@Override
public void saveReport(String location) {
System.out.println("Saving Excel report to: " + location);
}
}
8. Best Practices ✅
-
Đặt Tên Interface Rõ Ràng
// Không nên
public interface I { }
// Nên
public interface Drawable { } -
Sử Dụng Phương Thức Mặc Định
// Không nên
public interface Payment {
void process(double amount);
void validate(double amount);
}
// Nên
public interface Payment {
void process(double amount);
default void validate(double amount) {
if (amount <= 0) {
throw new IllegalArgumentException();
}
}
} -
Kết Hợp Interface
// Không nên
public interface BigInterface {
void method1();
void method2();
void method3();
void method4();
void method5();
}
// Nên
public interface Readable {
void read();
}
public interface Writable {
void write();
}
public interface ReadWrite extends Readable, Writable { }
9. Lỗi Thường Gặp ⚠️
-
Quên Triển Khai Phương Thức
// Lỗi
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
// Quên triển khai draw()
}
// Đúng
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing circle");
}
} -
Sử Dụng Modifier Không Phù Hợp
// Lỗi
public interface Payment {
private void validate() { } // Không thể sử dụng private
}
// Đúng
public interface Payment {
void validate(); // Mặc định là public
} -
Quên Ghi Đè Phương Thức Mặc Định
// Lỗi
public interface Logger {
default void log(String message) {
System.out.println(message);
}
}
public class FileLogger implements Logger {
// Quên ghi đè log()
}
// Đúng
public class FileLogger implements Logger {
@Override
public void log(String message) {
System.out.println("File: " + message);
}
}
10. Ví Dụ Thực Tế Nâng Cao 🎯
Quản Lý Hệ Thống Đa Phương Tiện
public interface MediaPlayer {
void play();
void pause();
void stop();
void setVolume(int volume);
}
public interface MediaRecorder {
void record();
void pauseRecording();
void stopRecording();
void saveRecording(String location);
}
public class AudioPlayer implements MediaPlayer {
private String currentTrack;
private int volume;
public AudioPlayer(String currentTrack) {
this.currentTrack = currentTrack;
this.volume = 50;
}
@Override
public void play() {
System.out.println("Playing audio: " + currentTrack);
}
@Override
public void pause() {
System.out.println("Pausing audio");
}
@Override
public void stop() {
System.out.println("Stopping audio");
}
@Override
public void setVolume(int volume) {
this.volume = volume;
System.out.println("Setting volume to: " + volume);
}
}
public class VideoRecorder implements MediaRecorder {
private String currentRecording;
private boolean isRecording;
public VideoRecorder(String currentRecording) {
this.currentRecording = currentRecording;
this.isRecording = false;
}
@Override
public void record() {
isRecording = true;
System.out.println("Recording video: " + currentRecording);
}
@Override
public void pauseRecording() {
isRecording = false;
System.out.println("Pausing video recording");
}
@Override
public void stopRecording() {
isRecording = false;
System.out.println("Stopping video recording");
}
@Override
public void saveRecording(String location) {
System.out.println("Saving video to: " + location);
}
}
Quản Lý Hệ Thống Bảo Mật
public interface Authentication {
boolean login(String username, String password);
void logout();
boolean isAuthenticated();
}
public interface Authorization {
boolean hasPermission(String permission);
void grantPermission(String permission);
void revokePermission(String permission);
}
public class User implements Authentication, Authorization {
private String username;
private boolean authenticated;
private Set<String> permissions;
public User(String username) {
this.username = username;
this.authenticated = false;
this.permissions = new HashSet<>();
}
@Override
public boolean login(String username, String password) {
// Thực hiện đăng nhập
authenticated = true;
return true;
}
@Override
public void logout() {
authenticated = false;
System.out.println("User logged out");
}
@Override
public boolean isAuthenticated() {
return authenticated;
}
@Override
public boolean hasPermission(String permission) {
return permissions.contains(permission);
}
@Override
public void grantPermission(String permission) {
permissions.add(permission);
System.out.println("Permission granted: " + permission);
}
@Override
public void revokePermission(String permission) {
permissions.remove(permission);
System.out.println("Permission revoked: " + permission);
}
}
💡 Lời khuyên: Hãy thực hành với các ví dụ thực tế để hiểu rõ hơn về cách sử dụng interface trong các tình huống khác nhau.
Tiếp Theo 🎯
Trong các bài học tiếp theo, chúng ta sẽ:
- Tìm hiểu về multiple inheritance
- Học cách sử dụng default methods
- Thực hành với các ví dụ thực tế
- Tìm hiểu về polymorphism