2024年12月

abstract class RzBaseModel {
const RzBaseModel();

factory RzBaseModel.fromJson(Map<String, dynamic> json) {

return switch (json['type']) {
  'user' => UserModel.fromJson(json),
  'product' => ProductModel.fromJson(json),
  'order' => OrderModel.fromJson(json),
  String() => throw FormatException('Unknown type: ${json['type']}'),
  _ => throw const FormatException('Missing type field in JSON'),
};

}
}

主要特点:

  1. 模式守卫 (Pattern Guards):使用 when 添加额外条件
    解构模式:可以直接从对象或列表中提取值
  2. 通配符模式:使用 _ 匹配任意值
    逻辑运算符:可以使用 &&、|| 组合多个模式

变量声明:可以在模式中声明变量

// API 响应处理
void handleApiResponse(Map<String, dynamic> response) {
switch (response) {

case {'status': 200, 'data': Map data}:
  handleSuccessResponse(data);

case {'status': int code, 'error': String message} when code >= 400:
  handleErrorResponse(code, message);

case {'status': int code} when code >= 500:
  handleServerError(code);

default:
  handleUnknownResponse(response);

}
}

设计模式

单例模式 Singleton pattern

确保一个类只有一个实例,并提供一个全局访问点获取该实例
场景:资源管理器,数据库连接池,线程池

系统配置管理器,读取配置文件并生成唯一的配置对象
原型模式 Prototype pattern

通过复制现有对象而不是实例化类来创建对象
场景:对象的创建非常耗时,资源密集

依赖注入 Dependency Injection(DI)

控制反转 IoC Inversion of Control
具体来说,依赖注入的实现方式是通过将依赖对象的创建和维护责任转移到外部容器中,使得类不需要自己实例化,而是通过外部容器进行注入。这样,类之间的依赖关系就被解耦了,代码的可维护性和可测试性也得到了提高。

书籍推荐

听说只要啃透了代码大全就可以了?

官方文档

  1. app.config 配置应用级的选项
  2. app.component 注册应用级的资源,确保组件在任何地方都是可用的
  3. 创建多个共存的vue应用,在同一个页面上,用vue控制一个大型页面中特殊的一小部分,则创建多个小的应用实例,分别将他们挂到所需的元素上
  4. v-bind,将元素的id attribute与组件的dynamic ID属性保持一致,如果绑定null或者undefined,则移除该元素
  5. v-bind 可以直接简写成:id, v-bind:id也可以
  6. const count = ref(0)
    count.value = 0

直接接受参数,ref()
不然直接输出count就是{value:0}

  1. 避免一个页面一个createApp()
  2. <script setup>里面单独放函数,const和import
    <template>里面放html
  3. 用有.value的ref,而不是普通变量,具有深层响应性,哪怕是里面的嵌套,其变化也能被检测

const obj = ref({nest:... , arr:.. })

function mutateDeeply(){
obj.value.arr.push('baz')
}

  1. shallow ref 浅层ref,只有.value
  2. reactive()
    const state =reactvive({count:0})
  3. 计算属性 computed(),复杂状态的响应逻辑,那个list可以用到这个,会缓存,只有响应式依赖更新的时候才重新计算
  4. 计算属性只读,需要读写的时候,拼装get,set
  5. computed()返回的是快照
  6. v-for 基于一个数组渲染一个列表,需要用到 v-for="item in xxxx",页面用得上
    或者v-for = "(item,index) in items"
  7. 通过key管理状态,v-for,列表就地更新,默认模式,前提是不依赖子组件状态或者临时dom状态
  8. 变更方法,将旧数组换成新的
  9. 输入 <input v-model="text">
  10. watch 直接作用于ref,侦听器,每次响应式状态发生变化时出发回调函数,默认懒执行,数据源变化才执行回调
  11. watch 和 watchEffect,不太明确,跳过

基本概念

  1. 面向对象编程 CCP
  2. upcasting
  3. 动态绑定,不知道返回的类型是什么,void或者virtual
  4. 方法,构造方法,为了提高复用设置的多个构造方法
  5. 方法名字相同,但参数不同,方法重载,overload,功能类似的方法使用同一个名字更容易记住,调用更简单;重载方法返回值类型应该相同。
  6. 继承,extends.
    7。private,子类无法访问父类的private,改成protected就可以了
  7. 如果父类没有默认的构造方法,子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法。

这里还顺带引出了另一个问题:即子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的。

  1. public sealed class Shape permits Rect, Circle, Triangle {

    ...

    }

只允许Rect,Circle,Triangle继承它,这种sealed一般多用在一些框架里面

  1. 向上转型,upcasting; Person父类,Student子类,Person p = new Student(); 成立
  2. 向下转型,downcasting,失败,子类比父类功能多,无法凭空变出来功能。
  3. instance of,一般用在判断里面
  4. 构造方法,Consctructor,自动调用,和class同名,可以有多个,没有返回类型,主要用来初始化对象的状态
    使用this可以在一个构造方法中调用另一个构造方法

    class Person {

      String name; //实例变量
      int age;
    
      public Person(String name,int age) {
            this.name = name;  this.name是实例变量,name是参数
            this.age = age;
      }

    }

    this.name当前对象的实例变量
    不能再静态方法中使用this,静态方法是类级别的,和实例无关
    this只在实例方法中有效

  5. .....中间缺失大量笔记,网页未保存,包括面向对象编程(多态,包,内部类等),Java核心类,异常处理(断言,日志,单元测试),反射(各种调用,动态代理)等笔记
  6. 反射,访问字段,调用方法,调用构造方法,动态代理
    动态代理部分还是不太明白,明天用A4纸自己画一遍好了

    静态代码:a.定义接口 b. 编写实现类 c. 创建实例,转型为接口,并调用
    动态代码:a.定义接口 b. 直接在main里面用proxy.newProxyInstance()创建接口对象,传入classloader,传入要实现的接口,传入处理调用方法的invocationHandler,将返回的object强制转型为接口

    通过proxy创建代理对象,将接口方法代理给InvocationHandler完成的

    不明白,还是不明白

  7. 注解,Annotation
    @Override
    @Target 定义Annotation能够被应用于源码的哪些位置
    @Retention 定义生命周期
    使用反射处理
  8. 泛型,一种模板,编写模板代码适应任意类型
    泛型类型T不能用于静态方法
    静态泛型方法应该和实例类型的泛型方法区分
    多个泛型,比如Map<K,V>,key是一种类型,value是另一种类型
    擦拭法 Type Erase,Java实现泛型的方法,虚拟机对泛型一无所知,所有工作都是编译器做的(这句话不明白),编译器里面有<T>,虚拟机眼里只有object
    从<T> 到<? extends Number>,表示泛型类型限定为Number以及Number的子类,extends通配符
    super通配符
    Pair <Integer> => Pair<? super Integer>
    接受所有泛型类型为Integer或其父类的Pair类型
    entendts只允许读
    super只允许写
    这块有点半懂不懂
  9. 集合
    List ArrayList LinkedList,链表,(每个元素都指向下一个元素)

      ArrayList各种操作的快,内存占用少
      iterator比for循环遍历list更高效,因为太常用,所以改成了for each,常见的遍历list 代码

    1734400005198.png

小技巧

对浮点数加上0.5,再强制转型,达到四舍五入的效果

基础算法

冒泡排序

1734411681820.png