11.16
[实验任务一]:学号的单一
仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。
实验要求:
-
画出对应的类图;
-
提交源代码;
// Student.java
package singleton;
/**
* 学生类 - 使用静态内部类实现单例模式
*/
public class Student {
private String studentId; // 学号
private String name; // 姓名
// 私有构造函数
private Student() {
// 防止反射创建实例
if (StudentHolder.INSTANCE != null) {
throw new RuntimeException("单例模式不允许创建多个实例");
}
}
// 私有静态内部类,持有单例实例
private static class StudentHolder {
private static final Student INSTANCE = new Student();
}
// 获取单例实例的公共方法
public static Student getInstance() {
return StudentHolder.INSTANCE;
}
// 设置学生信息
public void setStudentInfo(String studentId, String name) {
this.studentId = studentId;
this.name = name;
}
// 获取学号
public String getStudentId() {
return studentId;
}
// 获取姓名
public String getName() {
return name;
}
// 防止序列化破坏单例
protected Object readResolve() {
return getInstance();
}
// 防止克隆破坏单例
@Override
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException("单例模式不允许克隆");
}
}
// SingletonTest.java
package singleton;
/**
* 单例模式测试类
*/
public class SingletonTest {
public static void main(String[] args) {
System.out.println("------- 多线程测试 -------");
// 创建多个线程同时获取实例
Runnable task = () -> {
Student student = Student.getInstance();
System.out.println("线程 " + Thread.currentThread().getName()
+ " 获取的实例哈希码: " + student.hashCode());
};
// 启动多个线程
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(task, "Thread-" + i);
thread.start();
}
try {
Thread.sleep(1000); // 等待所有线程执行完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("\n------- 功能测试 -------");
// 测试基本功能
Student student1 = Student.getInstance();
student1.setStudentInfo("2022001", "张三");
Student student2 = Student.getInstance();
System.out.println("实例1和实例2是否相同:" + (student1 == student2));
System.out.println("学号:" + student2.getStudentId());
System.out.println("姓名:" + student2.getName());
System.out.println("\n------- 反射测试 -------");
// 测试反射是否能创建新实例
try {
java.lang.reflect.Constructor<Student> constructor =
Student.class.getDeclaredConstructor();
constructor.setAccessible(true);
Student student3 = constructor.newInstance();
System.out.println("通过反射创建实例");
} catch (Exception e) {
System.out.println("反射创建实例失败:" + e.getMessage());
}
}
}
3.注意编程规范。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步