Java
Beginner
1 min read
Abstract Classes vs Concrete Classes
Example
// Abstract class using Template Method pattern
abstract class DataProcessor {
// Template method: defines the algorithm skeleton
public final void process(String data) {
String validated = validate(data); // step 1
String transformed = transform(validated); // step 2 (abstract)
store(transformed); // step 3 (abstract)
System.out.println("Processing complete.");
}
// Concrete shared step
protected String validate(String data) {
if (data == null || data.isBlank())
throw new IllegalArgumentException("Data must not be blank");
return data.trim();
}
// Abstract steps — subclasses decide how to implement
protected abstract String transform(String data);
protected abstract void store(String data);
}
class UpperCaseFileProcessor extends DataProcessor {
@Override
protected String transform(String data) {
return data.toUpperCase();
}
@Override
protected void store(String data) {
System.out.println("[FILE] Storing: " + data);
}
}
class JsonProcessor extends DataProcessor {
@Override
protected String transform(String data) {
return "{\"value\": \"" + data + "\"}";
}
@Override
protected void store(String data) {
System.out.println("[DB] Inserting JSON: " + data);
}
}
public class AbstractClassDemo {
public static void main(String[] args) {
// new DataProcessor(); // compile error — abstract class
DataProcessor file = new UpperCaseFileProcessor();
file.process(" hello world ");
System.out.println();
DataProcessor json = new JsonProcessor();
json.process(" 42 ");
}
}