美文网首页
Java学习笔记2

Java学习笔记2

作者: wangmin | 来源:发表于2016-02-27 14:59 被阅读11次

Singleton / 不可变类 / 缓存不可变类 的实现

Singleton(单例类)

单例类用的地方很多,如果一个类始终只能创建一个实例,则这个类被称为单例类。

以下程序是创建一个单例类:

public class SingletonTest {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2);
        s1.setName("Singleton1");
        System.out.println("s1 = " + s1.getName());
        System.out.println("s2 = " + s2.getName());
        s2.setName("Singleton2");
        System.out.println("s1 = " + s1.getName());
        System.out.println("s2 = " + s2.getName());
    }
}
class Singleton {
    private String name;
    private static Singleton singleton = new Singleton("default");
    private Singleton(String name) {
        this.name = name;
    }
    public static Singleton getInstance() {
        return singleton;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
}

不可变类

不可变类就是在创建该类的实例后不能更改该类的属性。Java提供的8个包装类和java.lang.String都是不可变类。

创建不可变类的几个规则:

  • 使用private 和 final 修饰符修饰属性;
  • 提供带参数的构建起,用于初始化属性值;
  • 只提供getter方法;
  • 重写hashCode 和 equlas方法;
/**
 * Person 类是一个不可变类
 * @author wangmin
 *
 */
public class Person {
    private final String name;
    private final int age;
    public Person() {
        this.name = "";
        this.age = 0;
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return this.name;
    }
    public int getAge() {
        return this.age;
    }
    public boolean equlas (Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj.getClass() == this.getClass()) {
            Person p = (Person)obj;
            if (this.getName().equals(p.getName()) && this.age == p.getAge()) {
                return true;
            }
        }
        return false;
    }
    public int hasCode() {
        return name.hashCode() + age;
    }
}

缓存不可变类

如果程序经常需要使用相同的不可变类实例,则应该考虑缓存这种不可变类。下面是简单的使用数组的方式实现一个不可变类。

/**
 * 使用数组的方式来缓解Person
 * 1. 定义数组大小,并且使用private static 修饰
 * 2. 定义valueOf方法获取对象,但是其中存在以下几种情况:
 *  2.1 循环遍历整个缓存数组的大小,然后比较,如果已经被缓存则直接取出。(注意数组元素可能为null)
 *  2.2 由2.1的结果可知,如果数组中没有则新创建。
 *  2.3 首次判断pos是否已满,如果已满则将新的对象创建到数组0的位置,并且将pos设置为0,并返回。
 *  2.4 如果没有满则根据pos的位置创建,并返回。
 * @author wangmin
 *
 */
public class CachePerson {
    private static int MAX_SIZE = 10;
    private static CachePerson[] cp = new CachePerson[MAX_SIZE];
    private String name;
    private static int pos = 0;
    
    public CachePerson() {
        
    }
    public CachePerson(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    public static CachePerson valueOf(String name) {
        for (int i = 0; i < MAX_SIZE; i++) {
            if (cp[i] != null && cp[i].getName().equals(name)) {
                return cp[i];
            }
        }
        if (pos == MAX_SIZE) {
            cp[0] = new CachePerson(name);
            pos = 1;
        } else {
            cp[pos++] = new CachePerson(name);
        }
        return cp[pos-1];
    }
    public boolean equlas (Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj.getClass() == this.getClass()) {
            CachePerson cp = (CachePerson)obj;
            if (cp.getName().equals(this.getName())) {
                return true;
            }
        }
        return false;
    }
    public int hasCode() {
        return name.hashCode();
    }
}

相关文章

  • java学习笔记-日志篇

    java学习笔记-日志篇-目录 java日志篇(1)-日志概述 java日志篇(2)-JUL(java.util....

  • nio

    参考文章 Java Nio Java NIO学习笔记 - NIO客户端时序图 Java NIO学习笔记 - NIO...

  • Java 学习笔记(13)——lambda 表达式

    title: Java 学习笔记(11)——lambda 表达式tags: [Java 基础, 学习笔记, 函数式...

  • java io

    参考Java IO学习笔记(一):File类Java IO学习笔记(二):RandomAccessFile类Jav...

  • Java学习笔记

    Java学习笔记 day1 public class Hello2 { ​ public static voi...

  • 文章目录

    Markdown学习 Markdown学习 Java学习 Servlet学习笔记 Java问题 Tomcat问题修...

  • Java学习笔记2

    每一门编程语言的一个程序都是Hello world!那Java也不例外。 那么编译运行一个程序的过程是什么呢? 在...

  • Java学习笔记2

    下面程序结果 Demo2_Student静态代码块我是main方法Student 静态代码块Student 构造代...

  • Java学习笔记_2

    多线程。线程是进程中的一个执行单元(执行路径),可以并发。System.gc();申请启动垃圾回收器,垃圾回收器比...

  • Java学习笔记2

    Java常用修饰符 1、访问修饰符 (1)private 使用对象:变量、方法。 注意:不能修饰...

网友评论

      本文标题:Java学习笔记2

      本文链接:https://www.haomeiwen.com/subject/vbvwkttx.html