制作不可变的第三方课程

时间:2015-08-10 08:21:16

标签: java loops java-ee

我有两个课程,比如说Student和Book。

Student.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;
    }
}

Book.java

    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;
    }
}

学生班是我的班级,但书籍班是第三方班 我想在Student类中使用Book并使Student对象成为不可变的? 任何人都可以指导我如何做到这一点吗?

    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());

    }
}

我必须限制不改变书

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

2 个答案:

答案 0 :(得分:4)

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

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

示例:

public class MyBook {
    private Book book;

    public MyBook(...) { 
       book = new Book(...);
    }

    public String getTitle() { 
       return book.getTitle();
    }

 ...etc
}

它可能还取决于用例,换句话说,取决于“为什么”你需要使用Book类而不是创建自己的并转换到其他地方。

答案 1 :(得分:-2)

getBook()的Student类中按book.clone()执行克隆,前提是您的Book类实现了Cloneable接口和clone()方法。