Java ⾯向对象基础

⽅法设计

  • 单元:一个类或者一组类(组件)
    • 类采用名词结构
      • 动词过去式+名词
        • ContextRefreshedEvent
      • 动词ing + 名词
        • InitializingBean
      • 形容词 + 名词
        • ConfigurableApplicationContext
  • 执行:某个方法
    • 方法命名:动词
      • execute
      • callback
      • run
    • 方法参数:名词
    • 异常:
      • 根(顶层)异常
        • Throwable
          • checked 类型:Exception
          • unchecked类型:RuntimeException
          • 不常见:Error
      • Java 1.4java.lang.StackTraceElement
        • 添加异常原因(cause)
          • 反模式:吞掉某个异常
          • 性能:注意 fillInStackTrace()方法的开销,避免异常栈调用深度
            • 方法一:JVM 参数控制栈深度(物理屏蔽)
              • 好处: 不需要修改代码
            • 方法二:logback 日志框架控制堆栈输出深度(逻辑屏蔽)

代码在设计的时候就应该考虑性能问题。不是说你只是写业务代码不应该考虑性能问题,而后续在去调优。因为你前期没有把握好,后面就会狠痛苦。

在设计任何代码的之前都需要把性能和安全考虑进去,后续你设计的时候就会根据这个两个指标做折中处理。

泛型设置

Java 泛型属于编译时处理,运行时擦写。

List = List

1
2
3
4
5
6
7
8
9
10
/**
* 方法签名 #doConvert(List)
*
* @param value
*/
public static void doConvert(List<String> value) {
}
// 方法签名冲突, 方法签名 #doConvert(List)
public static void doConvert(List value) {
}

Java 函数式设计

匿名内置类

基本特性:

  • 无名称类
  • 声明位置(执行模块):
    • static block
    • 实例block
    • 方法
    • 构造器
  • 并非特殊的类结构
    • 类全名称:${package}.${declared_class}.${num}

函数式接口

基本特性:

  • 所有的函数式接口都引用一段执行代码
  • 函数式接口没有固定的类型,固定模式( SCFP = Supplier + Consumer + Function + Predicate) + Action
  • 利用方法引用来实现模式匹配

模块化

强封装性

基本特性

  • 并非所有的 public Class 都可以被运用,需要 exports 来配合
  • exports 所配置的 package 下必须要有 Class

负面问题

  • 对人的要求就高了(对 Class 透明化)
    • 必须了解相关 module-info.java 语义
    • 需要了解某些类的依赖
    • 需要了解某些类职责

个人观点

  • 收益不大,代价不小
  • 对团队要求极高,容易出现互喷的情况
  • Java 9 之前采用 jar 文件管理,Java 9 模块化之后,编程了 module-info.java 管理,还需要考虑与 Maven 依赖管理组件如何配合