1.3-常见Object方法

本文介绍如何使用Guava库中的Objects类简化Java中的equals、hashCode、toString和比较操作,减少代码冗余并提高代码可读性。

equals

当一个对象中的字段可以为null时,实现Object.equals方法会很痛苦,因为不得不分别对它们进行null检查。使用Objects.equal帮助你执行null敏感的equals判断,从而避免抛出NullPointerException。例如:

Objects.equal("a", "a"); // returns true
Objects.equal(null, "a"); // returns false
Objects.equal("a", null); // returns false
Objects.equal(null, null); // returns true

注意:JDK7引入的Objects类提供了一样的方法Objects.equals

 

hashCode

用对象的所有字段作散列[hash]运算应当更简单。Guava的Objects.hashCode(Object...)会对传入的字段序列计算出合理的、顺序敏感的散列值。你可以使用Objects.hashCode(field1, field2, …, fieldn)来代替手动计算散列值。

注意:JDK7引入的Objects类提供了一样的方法Objects.hash(Object...)

toString

好的toString方法在调试时是无价之宝,但是编写toString方法有时候却很痛苦。使用 Objects.toStringHelper可以轻松编写有用的toString方法。例如:

// Returns "ClassName{x=1}"
Objects.toStringHelper(this).add("x", 1).toString();
// Returns "MyObject{x=1}"
Objects.toStringHelper("MyObject").add("x", 1).toString();

compare/compareTo

实现一个比较器[Comparator],或者直接实现Comparable接口有时也伤不起。考虑一下这种情况:

class Person implements Comparable<Person> {
  private String lastName;
  private String firstName;
  private int zipCode;

  public int compareTo(Person other) {
    int cmp = lastName.compareTo(other.lastName);
    if (cmp != 0) {
      return cmp;
    }
    cmp = firstName.compareTo(other.firstName);
    if (cmp != 0) {
      return cmp;
    }
    return Integer.compare(zipCode, other.zipCode);
  }
}

这部分代码太琐碎了,因此很容易搞乱,也很难调试。我们应该能把这种代码变得更优雅,为此,Guava提供了ComparisonChain

ComparisonChain执行一种懒比较:它执行比较操作直至发现非零的结果,在那之后的比较输入将被忽略。

public int compareTo(Foo that) {
    return ComparisonChain.start()
            .compare(this.aString, that.aString)
            .compare(this.anInt, that.anInt)
            .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
            .result();
}

这种Java链式方法 连贯接口(fluent interface)风格的可读性更高,发生错误编码的几率更小,并且能避免做不必要的工作。更多Guava排序器工具可以在下一节里找到。

package com.study.utils;

import java.util.Objects;

import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Ordering;

public class L1 {

    public static void main(String[] args) {
        L1 l1 = new L1();
        l1.test1();
        l1.test2();
    }

    public void test1() {
        String a = "a";
        String b = "a";
        System.out.println(Objects.equals(a, b));
    }

    public void test2() {
        User a = new User("auan", "fei", 12345);
        User b = new User("duan", "fei", 12345);
        System.out.println(a.compareTo(b));
        a = new User("duan", "fei", 12345);
        b = new User("duan", "fei", 12345);
        System.out.println(a.compareTo(b));
        a = new User("duan", null, 12345);
        b = new User("duan", "fei", 12345);
        System.out.println(a.compareTo(b));
    }

    public class User {
        private String lastName;
        private String firstName;
        private int zipCode;

        public User(String a, String b, int c) {
            this.lastName = a;
            this.firstName = b;
            this.zipCode = c;
        }

        public int compareTo(User that) {
            return ComparisonChain.start()
                    .compare(this.lastName, that.lastName)
                    .compare(this.firstName, that.firstName, Ordering.natural().nullsLast())
                    .compare(this.zipCode, that.zipCode)
                    .result();
        }
    }
}

 

<think>我们正在处理一个PCB设计中的过孔样式违规错误。用户提供了具体的过孔坐标(107.153mm,9.109mm),该过孔从顶层到底层,尺寸为0.6mm(外径),孔径为0.3mm(内径)。 根据引用[2],过孔样式通常与设计规则中设置的过孔尺寸约束有关。设计规则中可能定义了允许的过孔尺寸范围(最小、最大和首选值),如果实际使用的过孔尺寸不在规则允许的范围内,就会触发违规。 此外,过孔样式违规还可能涉及过孔的类型(如盲孔、埋孔或通孔)是否被允许,以及过孔的层对设置(从顶层到底层是通孔)是否符合规则。 分析步骤: 1. 检查当前设计规则中关于过孔样式(Routing Via Style)的设置。通常规则会设置过孔直径和孔径的最小、最大和首选值。 2. 比较违规过孔的尺寸(直径0.6mm,孔径0.3mm)与规则中设置的允许范围。 3. 检查规则中是否允许使用通孔(从顶层到底层)。 4. 如果规则设置正确,但过孔尺寸不符合,则需要修改过孔尺寸或调整规则。 注意:过孔的尺寸包括直径(外径)和钻孔尺寸(内径)。规则中通常分别设置这两项的约束。 假设我们有以下设计规则(示例): - 过孔直径:最小0.4mm,最大0.8mm,首选0.5mm - 过孔孔径:最小0.2mm,最大0.4mm,首选0.3mm 那么,对于这个过孔(直径0.6mm在0.4-0.8mm之间,孔径0.3mm在0.2-0.4mm之间)应该是合规的。但为什么报违规呢?可能的原因包括: a. 该过孔所在的网络或区域有特定的规则约束(如不同的规则作用于不同的网络类或区域)。 b. 过孔的类型不符合规则要求(例如规则要求使用盲埋孔,而实际使用了通孔,但这里是从顶层到底层的通孔,通常是最常见的,所以可能性较低)。 c. 规则中设置了不同的过孔样式,而当前过孔没有使用规则中定义的“首选”过孔样式(但通常只要在范围内即可,除非规则要求必须使用首选值)。 另一种可能是,这个过孔位于一个特殊区域,比如板边距区域或者禁止布线区,但过孔样式违规通常只与尺寸有关。 因此,建议用户检查: 1. 设计规则中“Routing Via Style”规则的详细设置,特别是看是否有多个规则,以及哪个规则应用于这个过孔所在的网络或区域。 2. 确认违规过孔的属性,确保其尺寸和类型与规则匹配。 如果规则设置正确,但过孔仍然报错,可能需要检查规则优先级,或者是否有其他规则(如差分对规则)影响了该过孔。 另外,引用[2]提到了过孔模板库(Pad Via Template Library),如果该过孔是从外部库调用的,需要确保库中的过孔定义符合当前设计规则。 解决方案: 1. 调整过孔尺寸,使其符合规则要求。 2. 修改设计规则,放宽过孔尺寸的约束(如果设计允许)。 3. 如果该过孔是特殊的(如用于散热),可能需要单独为其创建规则,或者将其设置为规则例外。 最后,根据用户提供的坐标,可以定位到该过孔,查看其属性并确认其尺寸和网络等信息,以便进一步分析。 相关问题: 1. 如何检查PCB设计规则中的过孔样式设置? 2. 如何修改过孔的尺寸? 3. 如何为特定网络或区域设置不同的过孔规则? 4. 如何添加规则例外? 5. 过孔样式违规对PCB制造有什么影响?</think>### PCB过孔样式违规错误分析 在PCB设计中,"Routing Via Style Violation"(布线过孔样式违规)表示特定过孔的尺寸参数违反了设计规则约束。针对您提供的过孔参数: - 坐标: (107.153mm, 9.109mm) - 连接层:Top Layer 到 Bottom Layer(通孔) - 过孔尺寸:外径 0.6mm,孔径 0.3mm 以下是逐步分析及解决方案: --- ### 1. **违规原因分析** - **尺寸约束违规**(最常见原因): - 设计规则通常定义过孔外径和孔径的**允许范围**(最小/最大/优选值) - 示例规则约束: - 外径范围:0.4mm ~ 0.8mm - 孔径范围:0.2mm ~ 0.4mm - 您的过孔(外径0.6mm,孔径0.3mm)**在数值上合规**,但需检查: - 该过孔所属网络是否被特殊规则约束(如高速信号需更小过孔) - 是否位于特定区域(如板边禁布区) - **层对配置错误**: - 通孔(Top-Bottom)通常允许,但需确认规则是否禁用通孔 - **过孔类型不匹配**: - 规则可能要求使用盲/埋孔而非通孔(常见于HDI设计) --- ### 2. **验证设计规则** - **检查规则设置**(以Altium Designer为例): ```plaintext Design → Rules → Routing → Routing Via Style ``` - 确认`Min/Max Hole Size`和`Diameter`范围 - 检查`Where the First Object Matches`是否包含该过孔的网络 - **规则继承关系**: - 全局规则可能被网络类规则覆盖(如DDR、PCIe等高速信号) - 坐标(107.153,9.109)是否在Room或区域规则内? --- ### 3. **解决方案** #### 方案1:修改过孔参数(推荐) - 调整过孔尺寸至规则允许范围内: - 若规则要求孔径≤0.25mm:将孔径0.3mm→0.25mm - 若规则要求外径≥0.7mm:将外径0.6mm→0.7mm - **操作步骤**: ```plaintext 双击违规过孔 → Properties面板 → 修改Hole Size/Diameter → 重新DRC检查 ``` #### 方案2:放宽设计规则 - 若工艺允许(咨询PCB厂商): ```plaintext Design → Rules → 修改Via Style约束范围 ``` - 例如:`Hole Size`最大值从0.3mm→0.4mm #### 方案3:添加规则例外 - 为该过孔或网络创建例外规则: ```plaintext 右键点击违规 → Find Similar Objects → 创建新规则 ``` --- ### 4. **制造可行性验证** - **孔径比验证**: - 外径/孔径比 = 0.6/0.3 = 2:1 - 标准工艺要求≥1.5:1(0.3mm孔需外径≥0.45mm),您的设计**符合要求**[^1] - **层间对齐**: - 通孔从Top直通Bottom,需确认叠层结构无偏移风险 --- ### 5. **预防措施** - **过孔模板库管理**: 使用统一过孔库(如`<LibraryName>.PvLib`)避免参数错误[^2] - **规则优先级设置**: - 高速信号网络优先使用小过孔规则 - 电源网络允许更大过孔尺寸 - **DFM检查**: 使用工具验证最小孔壁厚度(铜厚≥18μm) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值