首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在java中创建不可变的类

如何在java中创建不可变的类
EN

Stack Overflow用户
提问于 2013-12-25 12:03:50
回答 8查看 2.6K关注 0票数 13

如何在java中创建不可变的类。如果学生类有关系(地址),如何创建不可变的类。我想让下面的类成为不可变的

代码语言:javascript
运行
复制
  final public class Student {
        private final Address add;
            private final int sid;
            public Student(int sid, String name, Address add) {
                super();
                this.sid = sid;
                this.name = name;
                this.add = add;
            }
            private final String name;
            public int getSid() {
                return sid;
            }
            public final String getName() {
                return name;
            }
            @Override
            public String toString() {
                return "Student [add=" + add + ", name=" + name + ", sid=" + sid + "]";
            }
            public Address getAdd() {
                return add;
            }


        }

        //I want to make the class below immutable
        public class Address {
            public int getAid() {
                return aid;
            }
            public String getStreet() {
                return street;
            }
            @Override
            public String toString() {
                return "Address [aid=" + aid + ", street=" + street + "]";
            }
            int aid;
            String street;
            public Address(int aid, String street) {
                super();
                this.aid = aid;
                this.street = street;
            }

        }


        public class First {
        public static void main(String[] args) {
            Address myAdd=new Address(179,"Maihill");
            Student st=new Student(99,"anoj",myAdd);
            System.out.println(st.toString());
            myAdd.aid=2376;
            System.out.println(st);
            System.out.println("***************");
            Address pAdd=st.getAdd();
            //Here modified address instance then how we can make immutable.
                pAdd.aid=788;
            System.out.println(st);

        }
        }

在这里我们可以修改address实例。请给我点子

EN

回答 8

Stack Overflow用户

发布于 2013-12-25 12:06:35

不可变的关键点是:

  • no setter方法
  • 使用Collections.unmodifiableList使变量成为私有的和最终的
  • 返回列表-从不返回任何可变字段;始终返回字段的副本(如果适用,则为深度)或不变版本的字段
  • make
  • final

<代码>H19如果变量在类中进行了内部更改,则此更改不可见,并且在类外部不起作用(包括影响<代码>D10和代码

票数 20
EN

Stack Overflow用户

发布于 2013-12-25 12:07:14

在您的类Address中,您应该将字段设置为private (应该)和final (必须),如下所示-

代码语言:javascript
运行
复制
public final class Address {       // so no sub-classes can be made.
  private final int aid;           // private and final.
  private final String street;     // private and final.
  // as before.
}

您也不能使用setter方法,但是当字段为final时,这不是什么大问题(因为任何setter方法都会产生编译器错误)。

票数 4
EN

Stack Overflow用户

发布于 2013-12-25 12:11:53

好吧,你让学生成为半不变的很好:

  • 它的属性是
  • ,它们是不可变的类型(除了地址)
  • ,并且它们在构造函数中初始化。

您应该将同样的事情应用于Address类,使其成为不可变的,然后Student的所有状态都将是不可变的。因此,它将是:

代码语言:javascript
运行
复制
public final class Address {
    private final int aid;
    private final String street;

    public Address(int aid, String street) {
        this.aid = aid;
        this.street = street;
    }


    public int getAid() {
        return aid;
    }

    public String getStreet() {
        return street;
    }

    ....
}

幸运的是,您没有任何可修改的类型(一些最知名的类型是DateCollectionMaps),否则您也应该考虑它们。

如果你有任何可变的属性,你应该在构造函数中复制保护它,并且你应该在状态泄漏的地方返回一个不可修改的或它的副本。

例如,如果你的Student类有一个birthDate属性,你应该这样做:

代码语言:javascript
运行
复制
public final class Student {
    private final Date birthDate;

    public Student(int sid, String name, Address address, Date birthDate) {
        this.sid = sid;
        this.name = name;
        this.address = address;
        this.birthDate = (birthDate == null) ? null : new Date(birthDate.getTime());
    }

    public Date getBirthDate() {
       return (birthDate == null) ? null : new Date(birthDate.getTime());
    }

    ....

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20768943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档