• Effective Java学习笔记---------类和接口


    使类和成员的可访问性最小化

    包含公有可变域的类通常不是线程安全的

    在仔细设计了一个最小的公有api之后,应该防止把散乱的类、接口或者成员变成api的一部分

    除了公有静态final域的特殊情形之外(此时它们充当常量),公有类都不应该包含公有域,并且要确保公有静态final域所引用的对象都是不可变的

    要在公有类中使用访问方法而非公有域

    1. package codeTemplate.effectiveJava.bean;
    2. import lombok.Getter;
    3. import lombok.Setter;
    4. import java.util.Arrays;
    5. import java.util.List;
    6. @Setter
    7. @Getter
    8. public class CommonBean {
    9. private String name = "123";
    10. //Make this final field static too.
    11. private final String finalName = "123";
    12. private static String staticName = "123";
    13. //常量【finalStaticName】命名应全部大写并以下划线分隔
    14. private static final String FINAL_STATIC_NAME = "123";
    15. private List names = Arrays.asList("123", "234");
    16. private final List finalNames = Arrays.asList("123", "234");
    17. private static List staticNames = Arrays.asList("123", "234");
    18. //常量【finalStaticNames】命名应全部大写并以下划线分隔
    19. private static final List FINAL_STATIC_NAMES = Arrays.asList("123", "234");
    20. private PhoneArea phoneArea;
    21. private PhoneArea phoneAreaNew = new PhoneArea("China");
    22. //Variable 'finalPhoneArea' might not have been initialized
    23. private final PhoneArea finalPhoneArea;
    24. //Make this final field static too.
    25. private final PhoneArea finalPhoneAreaNew = null;
    26. private static PhoneArea staticPhoneArea;
    27. //Variable 'staticFinalPhoneAreaNew' might not have been initialized
    28. private static final PhoneArea staticFinalPhoneArea;
    29. //常量【staticFinalPhoneAreaNew】命名应全部大写并以下划线分隔
    30. private static final PhoneArea STATIC_FINAL_PHONE_AREA_NEW = null;
    31. //Make publicName a static final constant or non-public and provide accessors if needed.
    32. public String publicName = "123";
    33. //Make this final field static too.
    34. public final String publicFinalName = "123";
    35. //Make publicStaticName a static final constant or non-public and provide accessors if needed.
    36. public static String publicStaticName = "123";
    37. //常量【publicFinalStaticName】命名应全部大写并以下划线分隔
    38. public static final String publicFinalStaticName = "123";
    39. //Make publicNames a static final constant or non-public and provide accessors if needed.
    40. public List publicNames = Arrays.asList("123", "234");
    41. public final List publicFinalNames = Arrays.asList("123", "234");
    42. //Make publicNames a static final constant or non-public and provide accessors if needed.
    43. public static List publicStaticNames = Arrays.asList("123", "234");
    44. //常量【publicFinalStaticNames】命名应全部大写并以下划线分隔
    45. public static final List publicFinalStaticNames = Arrays.asList("123", "234");
    46. //Make publicPhoneArea a static final constant or non-public and provide accessors if needed
    47. public PhoneArea publicPhoneArea;
    48. //Make publicPhoneArea a static final constant or non-public and provide accessors if needed
    49. public PhoneArea publicPhoneAreaNew = new PhoneArea("China");
    50. //Variable 'publicFinalPhoneArea' might not have been initialized
    51. public final PhoneArea publicFinalPhoneArea;
    52. //Make this final field static too.
    53. public final PhoneArea publicFinalPhoneAreaNew=null;
    54. //Make publicStaticPhoneAreaNew a static final constant or non-public and provide accessors if needed.
    55. public static PhoneArea publicStaticPhoneArea;
    56. //Variable 'publicStaticFinalPhoneArea' might not have been initialized
    57. public static final PhoneArea publicStaticFinalPhoneArea;
    58. //常量【publicStaticFinalPhoneAreaNew】命名应全部大写并以下划线分隔
    59. public static final PhoneArea publicStaticFinalPhoneAreaNew=null;
    60. }

    总结

    私有属性

    1. 常量时final需要和static共同使用,引用对象时可以单独使用,都一定要初始化。
    2. static final 属性命名应全部大写并以下划线分隔,为常量

    公有属性

    1. 常量都需要是static final
    2. 引用类型static final修饰为常量,可以只有final,不静态
    3. static final 属性命名应全部大写并以下划线分隔
    4. final修饰的都要初始化

    最好的使用

    1. private String name = "123";
    2. private static String staticName = "123";
    3. private static final String FINAL_STATIC_NAME = "123";
    4. private final List finalNames=new ArrayList<>();
    5. public static final String PUBLIC_FINAL_STATIC_NAME = "123";
    6. static final List PUBLIC_FINAL_STATIC_NAMES = Arrays.asList("123", "234");
    7. public final List publicFinalNames = Arrays.asList("123", "234");

    使可变性最小化

    不可变类是指其实例不能被修改的类,除非一定要可变,否则都应该是不可变的

    域除非一定要变,否则有设为final,不要为每个get方法编写一个set方法

    复合优先于继承

    继承打破了封闭性

    复合:增加一个私有域,引用现有类的一个实例。对应设计模式中装饰器模式和代理模式

    1. package codeTemplate.effectiveJava.bean;
    2. import java.util.List;
    3. public class BasicBean {
    4. private String name;
    5. private List functions;
    6. public BasicBean(String name, List functions) {
    7. this.name = name;
    8. this.functions = functions;
    9. }
    10. public void addFunction(String function) {
    11. this.functions.add(function);
    12. }
    13. }

    继承

    1. package codeTemplate.effectiveJava.bean;
    2. import java.util.List;
    3. public class RedBean extends BasicBean {
    4. private int number = 0;
    5. public RedBean(String name, List function) {
    6. super(name, function);
    7. }
    8. @Override
    9. public void addFunction(String function) {
    10. number++;
    11. super.addFunction(function);
    12. }
    13. }

    复合

    1. package codeTemplate.effectiveJava.bean;
    2. public class YellowBean {
    3. private int number = 0;
    4. private final BasicBean basicBean;
    5. public YellowBean(BasicBean basicBean) {
    6. this.basicBean = basicBean;
    7. }
    8. public void addFunction(String function) {
    9. number++;
    10. basicBean.addFunction(function);
    11. }
    12. }

    要么设计继承并提供文档说明,要么禁止继承

    接口优于抽象类

    接口使得安全地增强类的功能成为可能

    为接口提供一个抽象的骨架实现类(抽象类),即模板方法模式

    接口只用于定义类型

    常量接口模式是对接口的不良使用,应使用不可实例化额工具类,静态导入

    常量接口

    1. package codeTemplate.effectiveJava.bean;
    2. public interface Consts {
    3. String BOOK_NAME = "asds";
    4. }

    不可实例化的工具类

    1. package codeTemplate.effectiveJava.bean;
    2. public class Constants {
    3. private Constants() {
    4. }
    5. public static final String BOOK_NAME = "asds";
    6. }

    类层次优于标签类

    使用继承生成多个类,优于多个构造器生成不同的对象

    静态成员类(内部类)优于非静态成员类

    嵌套类存在的目的应该只是为它的外围类提供服务

    永远不要将多个顶级类或者接口放在一个源文件中

    顶级类:非成员类(内部类)

  • 相关阅读:
    【OpenCV 例程200篇】219. 添加数字水印(盲水印)
    ZYNQ图像处理项目——模板匹配数字识别(3)
    buu(rce命令执行)
    批量上传图片
    第三章 寄存器 (内存访问)
    引擎之旅 Chapter.4 日志系统
    kafka-consumer-groups 命令行工具使用手册
    [JS真好玩] 嘘!我改了掘金源代码!1行代码,让表格支持page_size切换,从每页10条变为20条!
    GEE开发之Modis_NPP数据分析和获取
    虚拟DOM和真实DOM的区别和联系
  • 原文地址:https://blog.csdn.net/jsq916/article/details/126705707