11.16

[实验任务一]:学号的单一
仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。
实验要求:

  1. 画出对应的类图;

  2. 提交源代码;

// 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.注意编程规范。

posted @   aallofitisst  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示