在 java 中,接口作为返回值类型时,方法实际返回的是实现了该接口的具体类实例。调用者通过接口引用接收对象,并仅能访问接口中定义的抽象方法,从而实现逻辑与实现的解耦。

getShape() 方法如何返回不同形状
该方法根据传入的类型参数创建具体的 Circle 或 Rectangle 对象,并将它们向上转型为 Shape 接口返回。调用方无需关心具体是哪种形状,只需调用 draw() 即可执行绘制操作。

public interface Shape {
void draw();
}
public class Circle implements Shape {
public void draw() { System.out.println("Drawing Circle"); }
}
public class Rectangle implements Shape {
public void draw() { System.out.println("Drawing Rectangle"); }
}
public class ShapeFactory {
public static Shape getShape(String type) {
if ("circle".equals(type)) return new Circle();
return new Rectangle();
}
}
public class Main {
public static void main(String[] args) {
Shape s = ShapeFactory.getShape("circle");
s.draw();
}
}
预期输出:
Drawing Circle
List 返回空集合的处理
当查询结果为空时,直接返回 null 会导致调用方出现 NullPointerException。最佳实践是返回一个空的不可变列表 Collections.emptyList(),这样调用方可以直接遍历而无需判空。

import java.util.*;
public interface UserRepository {
List<string> findActiveUsers();
}
public class UserService {
private UserRepository repo = new UserRepository() {
public List<string> findActiveUsers() {
return Collections.emptyList();
}
};
public void printUsers() {
List<string> users = repo.findActiveUsers();
for (String user : users) {
System.out.println(user);
}
}
}</string></string></string>
预期输出:(无输出)
为什么使用接口而非具体类作为返回值
使用接口作为返回值允许我们在不修改调用代码的情况下更换底层实现。例如,将 Circle 替换为 Square 只需要修改工厂类的判断逻辑,而 Main 中的 s.draw() 调用保持不变。这种设计符合依赖倒置原则,提高了系统的可扩展性和可测试性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











