以下是结合现代Java技术(如Java 8+ Lambda、Stream API、接口默认方法等)和设计模式的实操内容,通过宠物管理系统案例展示三大特性的实际应用:
使用现代Java技术(Java 8+)开发一个宠物管理系统,实现宠物信息管理、行为模拟和健康状态监控功能。系统将充分应用封装、继承、多态特性,并结合Stream API、Lambda表达式和接口默认方法等新特性。
Java 14引入的Record类是一种特殊的类,用于封装不可变数据,自动生成构造方法、getter、equals()、hashCode()和toString()方法。
// 使用Record类封装宠物基本信息(自动实现封装)
public record PetInfo(String name, int age, String breed) {}
// 宠物健康状态类(传统封装)
public class HealthStatus {
private boolean vaccinated;
private double weight;
private String lastCheckupDate;
public HealthStatus(boolean vaccinated, double weight, String lastCheckupDate) {
this.vaccinated = vaccinated;
this.weight = weight;
this.lastCheckupDate = lastCheckupDate;
}
// Getter和Setter方法(略)
}
设计多层次继承结构,结合抽象类和接口,实现代码复用与行为扩展。
// 抽象基类:动物
public abstract class Animal {
protected final PetInfo info;
protected HealthStatus healthStatus;
public Animal(PetInfo info) {
this.info = info;
}
// 抽象方法:所有动物必须实现叫声
public abstract String makeSound();
// 模板方法模式:定义喂养流程
public final void feed() {
System.out.println(info.name() + "正在进食...");
afterFeed();
}
// 子类可扩展的钩子方法
protected void afterFeed() {
System.out.println(info.name() + "吃完了");
}
// Getter方法
public PetInfo getInfo() {
return info;
}
public HealthStatus getHealthStatus() {
return healthStatus;
}
public void setHealthStatus(HealthStatus healthStatus) {
this.healthStatus = healthStatus;
}
}
// 接口:可训练的动物
public interface Trainable {
// 接口默认方法(Java 8+)
default void train() {
System.out.println(getTrainableName() + "正在接受训练");
performTrick();
}
// 抽象方法:执行特技
void performTrick();
// 私有方法(Java 9+)
private String getTrainableName() {
return this instanceof Animal ? ((Animal) this).getInfo().name() : "未知";
}
}
// 具体子类:狗
public class Dog extends Animal implements Trainable {
public Dog(PetInfo info) {
super(info);
}
@Override
public String makeSound() {
return "汪汪汪";
}
@Override
public void performTrick() {
System.out.println(getInfo().name() + "学会了坐下和握手");
}
// 重写钩子方法
@Override
protected void afterFeed() {
System.out.println(getInfo().name() + "摇尾巴表示感谢");
}
}
// 具体子类:猫
public class Cat extends Animal {
public Cat(PetInfo info) {
super(info);
}
@Override
public String makeSound() {
return "喵喵喵";
}
// 猫特有的方法
public void scratch() {
System.out.println(getInfo().name() + "在抓沙发");
}
}
通过多态实现统一的宠物管理接口,处理不同类型的宠物对象。
// 宠物管理系统
public class PetManager {
private final List<Animal> pets = new ArrayList<>();
// 添加宠物(多态参数)
public void addPet(Animal pet) {
pets.add(pet);
}
// 展示所有宠物信息(多态调用)
public void displayAllPets() {
pets.forEach(pet -> {
System.out.println("名字:" + pet.getInfo().name());
System.out.println("品种:" + pet.getInfo().breed());
System.out.println("叫声:" + pet.makeSound());
// 类型检查与向下转型
if (pet instanceof Trainable trainable) {
trainable.train();
}
if (pet instanceof Cat cat) {
cat.scratch();
}
System.out.println("-------------------");
});
}
// 使用Stream API过滤健康的宠物
public List<Animal> getHealthyPets() {
return pets.stream()
.filter(pet -> pet.getHealthStatus() != null &&
pet.getHealthStatus().isVaccinated() &&
pet.getHealthStatus().getWeight() > 0)
.toList();
}
// 使用函数式接口定义自定义过滤逻辑
public List<Animal> filterPets(Predicate<Animal> condition) {
return pets.stream()
.filter(condition)
.toList();
}
}
public class Main {
public static void main(String[] args) {
// 创建宠物
PetInfo dogInfo = new PetInfo("旺财", 3, "金毛");
Dog dog = new Dog(dogInfo);
dog.setHealthStatus(new HealthStatus(true, 25.5, "2023-05-10"));
PetInfo catInfo = new PetInfo("咪咪", 2, "英短");
Cat cat = new Cat(catInfo);
cat.setHealthStatus(new HealthStatus(true, 4.2, "2023-06-15"));
// 宠物管理系统
PetManager manager = new PetManager();
manager.addPet(dog);
manager.addPet(cat);
// 展示所有宠物
System.out.println("===== 宠物列表 =====");
manager.displayAllPets();
// 使用自定义过滤条件
System.out.println("===== 年龄大于2岁的宠物 =====");
manager.filterPets(pet -> pet.getInfo().age() > 2)
.forEach(pet -> System.out.println(pet.getInfo().name()));
}
}
Animal
类中定义喂养流程的模板,子类可以重写特定步骤。Predicate<Animal>
接口实现宠物过滤策略的动态切换。PetInfo
负责数据封装,PetManager
负责业务逻辑。final
和Record
类创建不可变对象,减少并发问题。问题:过度继承导致类层次结构复杂,维护困难。
解决方案:使用组合模式或接口实现替代深度继承。
问题:向下转型时出现ClassCastException
。
解决方案:使用instanceof
进行类型检查,或通过Visitor模式避免类型转换。
问题:错误地将内部实现暴露给外部。
解决方案:严格控制访问权限,使用private
和package-private
修饰符。
这个实操案例结合了现代Java特性,展示了如何在真实项目中应用封装、继承和多态。你可以基于此案例进一步扩展功能,如添加更多宠物类型、实现健康数据可视化等。如果需要对特定部分进行更详细的解释或优化建议,欢迎提出具体需求。
Java,Spring Boot,MyBatis,MySQL,RESTful API,Spring Security,JWT,Redis,Spring Data JPA,Thymeleaf,AOP,Maven, 微服务,宠物管理系统,ORM
资源地址:
https://pan.quark.cn/s/14fcf913bae6
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。