Static Method Patterns
Common Static Method Design Patterns
graph TD
A[Static Method Patterns] --> B[Utility Methods]
A --> C[Factory Methods]
A --> D[Singleton Methods]
A --> E[Validation Methods]
1. Utility Methods Pattern
Utility methods provide common, reusable functionality across an application:
public class StringUtils {
public static String capitalize(String input) {
if (input == null || input.isEmpty()) {
return input;
}
return input.substring(0, 1).toUpperCase() + input.substring(1);
}
public static boolean isEmpty(String str) {
return str == null || str.trim().length() == 0;
}
}
2. Factory Methods Pattern
Static factory methods create and return object instances:
public class UserFactory {
public static User createAdmin() {
User admin = new User();
admin.setRole("ADMIN");
return admin;
}
public static User createRegularUser(String username) {
User user = new User();
user.setUsername(username);
user.setRole("USER");
return user;
}
}
3. Singleton Implementation Pattern
public class DatabaseConnection {
private static DatabaseConnection instance;
private DatabaseConnection() {}
public static DatabaseConnection getInstance() {
if (instance == null) {
instance = new DatabaseConnection();
}
return instance;
}
}
Static Method Pattern Comparison
Pattern |
Purpose |
Key Characteristics |
Utility |
Reusable Operations |
Stateless, Generic Functions |
Factory |
Object Creation |
Centralized Object Generation |
Singleton |
Single Instance |
Controlled Object Instantiation |
Validation |
Data Checking |
Consistent Validation Logic |
4. Validation Methods Pattern
public class ValidationUtils {
public static boolean isValidEmail(String email) {
if (email == null) return false;
return email.matches("^[A-Za-z0-9+_.-]+@(.+)$");
}
public static boolean isStrongPassword(String password) {
return password != null &&
password.length() >= 8 &&
password.matches(".*[A-Z].*") &&
password.matches(".*[0-9].*");
}
}
Advanced Static Method Techniques
graph LR
A[Advanced Techniques] --> B[Immutable Methods]
A --> C[Functional Interfaces]
A --> D[Method Chaining]
LabEx Practical Example
public class MathOperations {
// Fluent static method design
public static class Calculator {
public static int add(int a, int b) {
return a + b;
}
public static int subtract(int a, int b) {
return a - b;
}
public static int multiply(int a, int b) {
return a * b;
}
}
public static void main(String[] args) {
int result = Calculator.add(5, 3)
|> Calculator.multiply(2);
System.out.println("Complex Calculation: " + result);
}
}
Best Practices
- Keep static methods pure and stateless
- Use for utility and helper functions
- Avoid complex business logic
- Ensure thread safety
- Consider performance implications
Common Anti-Patterns to Avoid
- Overusing static methods
- Creating complex static method dependencies
- Mixing concerns in utility classes
- Ignoring object-oriented principles
Key Takeaways
- Static methods provide flexible, reusable code
- Different patterns serve different purposes
- Choose the right pattern for your specific use case
- Maintain clean, readable, and efficient code structure