泛型_枚举_注解_单例

目录

一、泛型

作用:类型自动转换

1、泛型类

import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

/**
 * MyClass<S,T>泛型类往往充当父类存在,充当工具类使用
 */
public class Demo {

    public static void main(String[] args) {

        MyClass<Boolean, Integer> myClass = new MyClass<>();
        myClass.setS(true);
        Boolean s1 = myClass.getS();
        System.out.println(s1);//true

        myClass.demo("hello world");//a:hello world

        List<CharSequence> list = new ArrayList<>();
        myClass.ha(list);
    }
}

@Getter
@Setter
//泛型类
class MyClass<S, T> {

    private S s;//private String str;
    private T t;

    //泛型方法
    public  <A> void demo(A a) {
        System.out.println("a:" + a);
    }

//    public static S s1; //S/T很少充当静态成员变量

    //静态方法-->工具类-->一般都是泛型方法
    public static <T> T demo1(T t){//第二个T指返回值类型
        System.out.println(t);
        return t;
    }

    //泛型的上下限
    //上限:一般体现在类中extends
    //下限:一般体现在方法中   ?只能是String以及String的父类或父接口
    public void ha(List<? super String> list){

    }
}

2、泛型接口

用户模块  crud
商品模块  crud
 .... 
UserDao.java
public interface BaseDao<T> {

    void add(T entity);

    void delete(int id);

    void update(T entity);

    T selectOne(int id);

    List<T> selectAll();

}  




public abstract class BaseDaoImpl<T> implements BaseDao<T>{
    @Override
    public void add(T entity) {

    }

    @Override
    public void delete(int id) {

    }

    @Override
    public void update(T entity) {

    }

    @Override
    public T selectOne(int id) {
        return null;
    }

    @Override
    public List<T> selectAll() {
        return null;
    }
}

二、枚举

public enum UserEnum {

    user1,
    user2(1,"张三");

    private Integer id;
    private String name;

    public Integer getId(){
        return id;
    }

    public String getName(){
        return name;
    }

    public static void a(){
    }

    UserEnum() {
        System.out.println("无参构造...");
    }

    UserEnum(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public static void main(String[] args) {
        UserEnum user1 = UserEnum.user1;//有1个无参实例,默认走无参构造1次
        System.out.println(user1);//无参构造... user1
        System.out.println(UserEnum.user2.getName());//张三

    }
}

深入理解Java枚举类型(enum)

三、单例模式

单个实例,在一个进程(程序)里面有且只有一个对象,多进程里面,对象也必须是同一个对象
创建对象的方式:
new构造方法
clone
序列化流
反射

public class StudentTest {

    public static void main(String[] args) {
        Student student1 = Student.getInstance1();
        Student student2 = Student.getInstance1();
        System.out.println("student1:" + student1);//student1:Student@74a14482
        System.out.println("student2:" + student2);//student2:Student@74a14482

//        for (int j = 0; j < 3; j++) {
//            new Thread(() -> {
//                for (int i = 0; i < 10; i++) {
//                    System.out.println(Thread.currentThread().getName() + ": " + Student.getInstance1());
//                }
//            }).start();
//        }
        for (int j = 0; j < 3; j++) {
            new Thread(() -> {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName() + ": " + Student.getInstance2());
                }
            }).start();
        }

    }
}

class Student {
    private Student() {
    }

    //饿汉模式:线程安全 弊端:没有体现懒加载的思想,直接new了
    //构造方法私有化,获得对象
    //提供静态变量,直接初始化
    private static Student student1 = new Student();

    //懒汉模式:单线程下操作没问题 多线程并发则不安全(内存不可见)
    //解决方式 加同步方法(不推荐)或同步代码块(sychronized) 效率慢
    //推荐同步代码块:DCL:双重检测锁 double check lock,存在隐患 指令重排(volatile)
    //创建对象:1、开辟内存空间 2、初始化成员变量 3、赋值
    private static Student student2;//null

    public static Student getInstance1() {
        return student1;
    }

    public static Student getInstance2() {
        //双重检测
        if (student2 == null) {//只有第一次进入时为空
            synchronized (Student.class) {
                //体现了懒加载
                if (student2 == null) {
                    student2 = new Student();
                }
            }
        }
        return student2;
    }
}

 克隆+序列化+反射    都会打破单例(序列化下使用readResolve可以保证单例模式)

序列化不走构造

public class Student implements Serializable, Cloneable {

    private static final long serialVersionUID = 2092414525597568198L;

    private Student() {
    }

    private volatile static Student student;//null

    public static Student getInstance() {
        if (student == null) {
            synchronized (Student.class) {
                if (student == null) {
                    student = new Student();
                }
            }
        }
        return student;
    }

    //克隆
    @SneakyThrows
    @Override
    public Student clone() {
//        return (Student) super.clone();//无法保证一个实例
        return this;//可以保证一个实例
    }


    //序列化
    public Object readResolve() {//可以保证单例模式
        return student;//返回的对象是本身
    }

}

java单例模式——详解JAVA单例模式及8种实现方式

四、注解

 项目开发方式:
   1.配置方式   配置文件  xml  properties   集成框架之间关系
       html--->controller--->service---->dao---->DB
               SpingMVC      Spring     mybatis   mysql    
      效率慢  可维护性较高 
       
   2.注解开发    
       效率快  解决问题时间  

语法:  @解释名 

 

jdk内置的注解:
@Deprecated
@SuppressWarnings("all")//压制所有警告
public class AnnoTest {


    private String name;

    @Override
    public String toString() {
        return "AnnoTest{" +
                "name='" + name + '\'' +
                '}';
    }

    @Deprecated     //表示过时方法
    public void a() {

    }

    public void b(@NonNull String name) {

        List list = new ArrayList();
        list.add(123);//警告
    }
    
    @SuppressWarnings    //压制C方法的警告
    public void c() {

        List list = new ArrayList();
        list.add(123);//警告
    }
}
   

元注解

@Target:    //标记注解可以在哪里被使用
@Retention     //标识注解的生命区间。源代码  class  整个运行期间
@Documented: javadoc    //在文档里面使用
@inherited      //继承  其它子类获得父类注解
@FunctionalInterface  修饰接口   面向函数式编程的表示,表示着接口只有一个方法

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}
 public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE,
  
    TYPE_PARAMETER,
    TYPE_USE

 

自定义注解

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值