有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使第三方类不可变

我有两个班,比如学生和书本,如下所示

学生。爪哇

    public final class Student {

    private final String name;
    private final Book book;

    public Student(String name, Book book) {
        this.name = name;
        this.book = book;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @return the book
     */
    public Book getBook() {
        return book;
    }
}

书。爪哇

    public final class Book {

    private int pages;

    /**
     * @return the pages
     */
    public int getPages() {
        return pages;
    }

    /**
     * @param pages
     *            the pages to set
     */
    public void setPages(int pages) {
        this.pages = pages;
    }
}

学生班是我的班,而图书班是第三方班
我想在我的学生类中使用Book并使学生对象成为不可变的? 谁能指导我怎么做

    public final class Immutable {
    public static void main(String[] args) {
        Book b = new Book();
        b.setPages(35);
        Student s = new Student("kiran", b);
        System.out.println(s.getBook().getPages());
        s.getBook().setPages(56);
        System.out.println(s.getBook().getPages());

    }
}

我必须限制自己不换这本书

我必须使学生对象不可变。一旦使用name和book创建了学生对象,则不应更改学生对象。我的意思是,如果某个XYZ学生创建了75页的书,那么XYZ学生应该是不可变的,我的意思是我们不能更改这个学生的书页


共 (2) 个答案

  1. # 1 楼答案

    在学生类的getBook()中,通过book.clone()执行克隆,前提是Book类实现Cloneable接口和clone()方法

  2. # 2 楼答案

    我看到了两种常见的方法:

    • 只提供这本书的副本,因此任何更改都不会反映在真正的书上,但如果你问我,这是一个坏主意,因为如果你不仔细阅读文档(如果你写的话),使用它的每个人都会感到困惑
    • 创作你自己的书。您可以扩展旧书,但这意味着对setter方法抛出异常或忽略调用——同样令人困惑。因此,我将创建一个包装器对象,它包含原始图书,但只提供getter作为公共方法。例如:

    例如:

    public class MyBook {
        private Book book;
    
        public MyBook(...) { 
           book = new Book(...);
        }
    
        public String getTitle() { 
           return book.getTitle();
        }
    
     ...etc
    }
    

    它可能还取决于用例,换句话说,取决于您需要使用该Book类而不是创建自己的类并在其他地方转换的“原因”