Effective java读书笔记

第一章节

1)利用静态工厂方法代替构造器

//com.insanus.OldNews.java
package com.insanus;
public class OldNews {
    //private static OldNews object = null;
    private OldNews() {
    }
    public static OldNews createOldNews() {
        //if (object != null)
        //    return object;
        return new OldNews();
    }
    //public static <T, V> HashMap<T, V> createOldNews() {
    //}
}

注释部分使代码更像singleton

四大优点:

  1. 静态工厂方法具有名字,使用起来更加清楚
  2. 可以不用每次调用时都创建新的对象
  3. 可以返回任何子对象的实例
  4. 在构造参数化类型实例可以使代码变得简洁

缺点:

  1. 如果不存在不受保护的构造器,会导致无法构造子对象实例
  2. 静态工厂方法和其他静态方法没什么区别

2)构建器1

//com.insanus.People.java
package com.insanus;
public class People {
    private int year;
    private String name;
    private float weight;
    private float height;
    //构建器
    public static class Builder {
        private int year;
        private String name;
        private float weight = 0;
        private float height = 0;
        public Builder(int year, String name) {
            this.year = year;
            this.name = name;
        }
        public Builder setWeight(float weight) {
            this.weight = weight;
            return this;
        }
        public Builder setHeight(float height) {
            this.height = height;
            return this;
        }
        public People createPeople() {
            return new People(this);
        }
    }
    private People(Builder builder) {
        year = builder.year;
        name = builder.name;
        weight = builder.weight;
        height = builder.height;
    }
}

这样就能使代码变得非常简洁,可扩展性也大大提升

People people = new People.Builder(18, "insanus").setHeight(180).createPeople();

相比于JavaBean和重叠构造器。构建器拥有更多优点

3)私有构造器或枚举强化singleton属性

第一种写法

//com.insanus.Singleton1.java
public class Singleton1 {
    public static final Singleton1 INSTANCE = new Singleton1();
    private Singleton1() {
    }
    public void method() {
    }
}

第二种写法

//com.insanus.Singleton2.java
public class Singleton2 {
    private static final Singleton2 INSTANCE = new Singleton2();
    private Singleton2() {
    }
    //静态工厂方法
    public static Singleton2 getSingleton() {
        return INSTANCE;
    }
    public void method() {
    }
}

第三种写法

//com.insanus.Singleton3.java
public enum Singleton2 {
    INSTANCE;
    public void method() {
    }
}

扩展:enum2

4)通过私有构造器强化不可实例化

我们甚至可以在私有构造器中抛出异常

//com.insanus.UtilityClass.java
package com.insanus;
public class UtilityClass {
    private UtilityClass() {
        throw new AssertionError();
    }
}

5)避免创建不必要的对象

不要这样写String s = new String("Text");

这样写会使编译器创建更多的String实例,正确的写法是
String s = "Text";

重用已知不会被修改的可变对象

//effective java例子
import java.util.Date;
import java.util.TimeZone;
import java.util.Calendar;
class Person {
    private final Date birthDate;
    //这里还没设置birthDate数据
    private static final Date BOOM_START;
    private static final Date BOOM_END;
    static {
        Calendar gmtCal =
                Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
        BOOM_START = gmtCal.getTime();
        gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
        BOOM_END = gmtCal.getTime();
    }
    public boolean isBabyBoomer() {
        return birthDate.compareTo(BOOM_START) >=0 &&
                birthDate.compareTo(BOOM_END) <=0;
    }
}

利用静态域,使代码不必重复创建对象,极大提高性能

使用基本类型而不是装箱基本类型

观察Long ilong i的区别
两者性能千差万别,所以要优先使用基本类型而不是装箱基本类型

6)消除过期的对象引用

众所周知,java是一种具有垃圾回收回收的语言。然而,我们依旧得关注内存管理的问题。

//com.insanus.List.java
package com.insanus;
public class List {
    private Object[] elements;
    private int size = 0;
    private static final int MAX = 1000;
    public List() {
        elements = new Object[MAX];
    }
    //...
    public Object pop() {
        if (size == 0) {
            throw new EmptyStackException();
        }
        return elements[--size];
        //我们关注在这里
    }
}

但你确定不再引用这些对象的时候,编译器却不知道,它依旧勤勤恳恳的维护这些过期的对象。所以,我们应该消除这些过期的对象引用。

//升级版的pop
public Object pop() {
    if (size == 0) {
            throw new EmptyStackException();
        }
    Object i = elements[--size];
    elements[size] = null;
    //我们从这里消除了过期的对象引用
    return Object;
}

7)避免使用finalize()

首先提几个缺陷:

  1. 你不能保证finalize一定被执行,当然,这不是你的原因。
  2. finalize的优先级太低,大概可以比喻成,饭都盛进去了,而碗还没有洗
  3. 使用finalize会导致严重的性能缺失

但我们确实需要一个终止功能时,该如何编写终止方法。

显式的终结

//com.insanus.Died.java
package com.insanus;
public class Died {
    private boolean isDie;
    //我们在私有域中写了这么一句话,当我要引用这个对象的方法是,想检查一下是不是被终结了
    public void cancel() {
        isDie = true;
    }
}

当我确定要使用finalize时,请确保super.finalize(),因为终结方法链不会自动执行。

【SCI复现】含可再生能源与储能的区域微电网最优运行:应对不确定性的解鲁棒性与非预见性研究(Matlab代码实现)内容概要:本文围绕含可再生能源与储能的区域微电网最优运行展开研究,重点探讨应对不确定性的解鲁棒性与非预见性策略,通过Matlab代码实现SCI论文复现。研究涵盖多阶段鲁棒调度模型、机会约束规划、需求响应机制及储能系统优化配置,结合风电、光伏等可再生能源出力的不确定性建模,提出兼顾系统经济性与鲁棒性的优化运行方案。文中详细展示了模型构建、算法设计(如C&CG算法、大M法)及仿真验证全过程,适用于微电网能量管理、电力系统优化调度等领域的科研与工程实践。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事微电网、能源管理相关工作的工程技术人员。; 使用场景及目标:①复现SCI级微电网鲁棒优化研究成果,掌握应对风光负荷不确定性的建模与求解方法;②深入理解两阶段鲁棒优化、分布鲁棒优化、机会约束规划等先进优化方法在能源系统中的实际应用;③为撰写高水平学术论文或开展相关课题研究提供代码参考和技术支持。; 阅读建议:建议读者结合文档提供的Matlab代码逐模块学习,重点关注不确定性建模、鲁棒优化模型构建与求解流程,并尝试在不同场景下调试与扩展代码,以深化对微电网优化运行机制的理解。
个人防护装备实例分割数据集 一、基础信息 数据集名称:个人防护装备实例分割数据集 图片数量: 训练集:4,524张图片 分类类别: - Gloves(手套):工作人员佩戴的手部防护装备。 - Helmet(安全帽):头部防护装备。 - No-Gloves(未戴手套):未佩戴手部防护的状态。 - No-Helmet(未戴安全帽):未佩戴头部防护的状态。 - No-Shoes(未穿安全鞋):未佩戴足部防护的状态。 - No-Vest(未穿安全背心):未佩戴身体防护的状态。 - Shoes(安全鞋):足部防护装备。 - Vest(安全背心):身体防护装备。 标注格式:YOLO格式,包含实例分割的多边形坐标和类别标签,适用于实例分割任务。 数据格式:来源于实际场景图像,适用于计算机视觉模型训练。 二、适用场景 工作场所安全监控系统开发:数据集支持实例分割任务,帮助构建能够自动识别工作人员个人防护装备穿戴状态的AI模型,提升工作环境安全性。 建筑与工业安全检查:集成至监控系统,实时检测PPE穿戴情况,预防安全事故,确保合规性。 学术研究与创新:支持计算机视觉在职业安全领域的应用研究,促进AI与安全工程的结合。 培训与教育:可用于安全培训课程,演示PPE识别技术,增强员工安全意识。 三、数据集优势 精准标注与多样性:每个实例均用多边形精确标注,确保分割边界准确;覆盖多种PPE物品及未穿戴状态,增加模型鲁棒性。 场景丰富:数据来源于多样环境,提升模型在不同场景下的泛化能力。 任务适配性强:标注兼容主流深度学习框架(如YOLO),可直接用于实例分割模型开发,支持目标检测和分割任务。 实用价值高:专注于工作场所安全,为自动化的PPE检测提供可靠数据支撑,有助于减少工伤事故。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值