Java中单例类和不可变类的理解
来源:互联网 发布:3g网络网速 编辑:程序博客网 时间:2024/04/27 19:52
1.如果一个类始终只能创建一个实例,则这个类被称为单例类。
思路:public static void main(String[] args)不创建实例,而是引用类中方法内创建的实例。
创建一个新对象,使用new,就要使用构造函数。既然是单例,就不能使用构造函数来创建(于是将类中构造函数权限设置为private),只能引用已有的,用getClassname去调用类中方法中创建的仅有只有的一个实例。没有new对象,而在public static void main(String[] args)静态上下文要引用静态方法,则类名.method,必须static。
class Animal{private static Animal instance;private Animal(){};public static Animal getAnimal(){if(instance == null){instance = new Animal();}return instance;}}public class PrivateFinalMethodTest {public static void main(String[] args){Animal a = Animal.getAnimal();Animal b = Animal.getAnimal();System.out.println(a == b);}}
2.不可变类
final修饰引用对象的变量,则变量指向的对象地址不变,但是对象的内容可以变化。final int[] iArr = {1,3,2,4},可以赋值iArr[1] = 5,改变对象的内容。而在很多时候,需要类的内容也不可变。例如,创建一个人的类的实例,若名字作为主键,则名字必须不可变。
在Person、Name类中,主类为Person。在主类中,创建一个private final Name name来保存Name类的名字实例Name name,但两者不能指向同一个地址,也就是不能引用同一个对象,在赋值的时候,需要new一下,那么在改动Name name中的量,无关private final Name name。同样在获取的时候,直接用private final Name name来代替Name name。
class Name{private String firstName;private String lastName;public Name(){}public Name(String firstName,String lastName){this.firstName = firstName;this.lastName = lastName;}public void setFirstName(String firstName){this.firstName = firstName;}public void setlastName(String firstName){this.lastName = lastName;}public String getFirstName(){return this.firstName;}public String getLastName(){return this.lastName;}}public class Person{private final Name name;/*public Person(Name name){this.name = name;}public Name getName(){return name;}*/public Person(Name name){this.name = new Name(name.getFirstName(),name.getLastName()); //两者引用不同的对象,地址不同,但是内容相同}public Name getName(){//return new Name(name.getFirstName(),name.getLastName()); //在获取时用private final Name name,而不是Name name。直接return this.name也一样,没必要new一下。return this.name;}public static void main(String[] args){Name n = new Name("Genz","ZHANG");Person p =new Person(n);System.out.println(p.getName().getFirstName());n.setFirstName("bajie"); //改变Name n的内容,无关this.name的内容System.out.println(p.getName().getFirstName()); //private final Name name未变System.out.println(n.getFirstName()); //Name n的内容改变}}
0 0
- Java中单例类和不可变类的理解
- Java final关键字和String常量 不可变的理解
- java的不可变类
- Java的不可变类
- Java的可变类和不可变类
- java的可变类和不可变类
- Java-可变类和不可变类
- Java 不可变类
- Java不可变类
- java 不可变类
- Java-不可变类
- 深入理解String为什么是不可变的类
- 深入理解String为什么是不可变的类
- 深入理解String为什么是不可变的类
- 缓存不可变类实例的不可变类【参考疯狂Java讲义】
- Java中的不可变类
- Java中的不可变类
- JAVA中的不可变类
- Redis源码学习2-内存管理
- xsd转化为XML格式
- WebAPI 添加模型验证
- 避免Block中的强引用环
- Struts 1.x | <logic> 标签库
- Java中单例类和不可变类的理解
- Single Number
- php中抽象类abstruct和接口interface的共同点与不同点区别
- ASP之vbscript的HTML事件
- Jedis的Publish/Subscribe功能的运用
- Android: Run systrace under windows
- Redis源码学习3-基本数据结构之双向链表
- sizeof
- 文人程序员