Loading...
Loading...
Refactors legacy Java code to modern patterns and best practices. Use when modernizing old Java code, converting to Java 8+ features, refactoring legacy applications, applying design patterns, improving error handling, extracting methods/classes, converting to streams/Optional/records, or migrating from old Java versions. Works with pre-Java 8 code, procedural Java, legacy frameworks, and outdated patterns.
npx skill4agent add dawiddutoit/custom-claude java-best-practices-refactor-legacy# Refactor a single legacy class
Refactor LegacyUserService.java to modern Java
# Refactor entire legacy package
Modernize all Java files in src/main/java/com/example/legacy/// Before: Anonymous inner class
Comparator<User> comparator = new Comparator<User>() {
@Override
public int compare(User u1, User u2) {
return u1.getName().compareTo(u2.getName());
}
};
// After: Lambda and method reference
Comparator<User> comparator = Comparator.comparing(User::getName);// Before: Imperative loops
List<String> names = new ArrayList<>();
for (User user : users) {
if (user.isActive()) {
names.add(user.getName().toUpperCase());
}
}
Collections.sort(names);
// After: Functional streams
List<String> names = users.stream()
.filter(User::isActive)
.map(User::getName)
.map(String::toUpperCase)
.sorted()
.toList();// Before: Null returns
public User findUser(String id) {
User user = repository.findById(id);
return user != null ? user : DEFAULT_USER;
}
// After: Optional
public Optional<User> findUser(String id) {
return repository.findById(id);
}
// Usage
User user = findUser(id).orElse(DEFAULT_USER);// Before: Boilerplate DTO
public class UserDTO {
private final String name;
private final String email;
// constructor, getters, equals, hashCode...
}
// After: Record
public record UserDTO(String name, String email) {}// Before: Manual resource management
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("file.txt"));
// use reader
} finally {
if (reader != null) {
try { reader.close(); } catch (IOException e) {}
}
}
// After: Try-with-resources
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
// use reader
} catch (IOException e) {
log.error("Failed to read file", e);
}// Before: Long method
public void processOrder(Order order) {
// Validation (20 lines)
// Calculate total (15 lines)
// Save order (10 lines)
}
// After: Extracted methods
public void processOrder(Order order) {
validateOrder(order);
double total = calculateTotal(order);
saveOrder(order, total);
}// Before: God class
public class OrderProcessor {
public void processOrder(Order order) { /* ... */ }
public void validateOrder(Order order) { /* ... */ }
public double calculateTotal(Order order) { /* ... */ }
public void sendEmail(Order order) { /* ... */ }
public void updateInventory(Order order) { /* ... */ }
}
// After: Separated responsibilities
public class OrderProcessor {
private final OrderValidator validator;
private final OrderCalculator calculator;
private final OrderNotifier notifier;
private final InventoryManager inventory;
public void processOrder(Order order) {
validator.validate(order);
double total = calculator.calculateTotal(order);
order.setTotal(total);
inventory.updateInventory(order);
notifier.sendOrderConfirmation(order);
}
}// Before
try {
processPayment(order);
} catch (Exception e) {
e.printStackTrace();
}
// After
try {
processPayment(order);
} catch (PaymentException e) {
log.error("Payment processing failed for order {}", order.getId(), e);
throw new OrderProcessingException("Failed to process order payment", e);
}public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(Long id) {
super("User not found with ID: " + id);
}
}<!-- Lombok (for reducing boilerplate) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
<!-- SLF4J for logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>