源码解读

 

 


转载:

 

先找了一个最简单的java.lang.Boolean开始解剖。

首先我们剔除所有的方法和静态变量,Boolean的核心代码如下:

public final class Boolean implements java.io.Serializable,Comparable
{
    private final boolean value;
}

很明显,凡是成员变量都是final类型的,一定是immutable class,这个Boolean和String一样,一旦构造函数执行完毕,实例的状态就不能再改变了。

Boolean的构造函数有两个:

public Boolean(boolean value) {
    this.value = value;
}
public Boolean(String s) {
    this(toBoolean(s));
}

都很简单就不多说了。

另外注意到Boolean类实际上只有两种不同状态的实例:一个包装true,一个包装false,Boolean又是immutable class,所以在内存中相同状态的Boolean实例完全可以共享,不必用new创建很多实例。因此Boolean class还提供两个静态变量:

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);

这两个变量在Class Loader装载时就被实例化,并且申明为final,不能再指向其他实例。

提供这两个静态变量是为了让开发者直接使用这两个变量而不是每次都new一个Boolean,这样既节省内存又避免了创建一个新实例的时间开销。

因此,用
    Boolean b = Boolean.TRUE;

    Boolean b = new Boolean(true);
要好得多。

如果遇到下面的情况:
    Boolean b = new Boolean(var);
一定要根据一个boolean变量来创建Boolean实例怎么办?

推荐你使用Boolean提供的静态工厂方法:
    Boolean b = Boolean.valueOf(var);
这样就可以避免创建新的实例,不信看看valueOf()静态方法:

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}

这个静态工厂方法返回的仍然是两个静态变量TRUE和FALSE之一,而不是new一个Boolean出来。虽然Boolean非常简单,占用的 内存也很少,但是一个复杂的类用new创建实例的开销可能非常大,而且,使用工厂方法可以方便的实现缓存实例,这对客户端是透明的。所以,能用工厂方法就 不要用 new。

和Boolean只有两种状态不同,Integer也是immutable class,但是状态上亿种,不可能用静态实例缓存所有状态。不过,SUN的工程师还是作了一点优化,Integer类缓存了-128到127这256个 状态的Integer,如果使用Integer.valueOf(int i),传入的int范围正好在此内,就返回静态实例。

hashCode()方法很奇怪,两种Boolean的hash code分别是1231和1237。估计写Boolean.java的人对这两个数字有特别偏好:

public int hashCode() {
    return value ? 1231 : 1237;
}

equals()方法也很简单,只有Boolean类型的Object并且value相等才返true:

public boolean equals(Object obj) {
    if (obj instanceof Boolean) {
        return value == ((Boolean)obj).booleanValue();
    }
    return false;
}

顺便提一句:很多人写equals()总是在第一行写:
   if (obj==null) return false;
其实完全没有必要,因为如果obj==null,下一行的
    if (obj instanceof Type)
就肯定返回false,因为(null instanceof AnyType) = false。
详细内容请参考《Effective Java》第7条:Obey the general contract when overriding equals。

其他的方法如toString()就更简单了,只要稍微熟悉java的程序员相信都能写出来,我就不多说了。

★ 总结 ★

1.如果一个类只有有限的几种状态,考虑用几个final的静态变量来表示不同状态的实例。
例如编写一个Weekday类,状态只有7个,就不要让用户写new Weekday(1),直接提供Weekday.MONDAY即可。

2.要防止用户使用new生成实例,就取消public构造函数,用户要获得静态实例的引用有两个方法:如果申明public static var就可以直接访问,比如Boolean.TRUE,
第二个方法是通过静态工厂方法:Boolean.valueOf(?)

3.如果不提供public构造函数,让用户只能通过上面的方法获得静态变量的引用,还可以大大简化equals()方法:
    public boolean equals(Object obj) {
        return this==obj;
    }
可以直接用==比较引用,绝对没有问题,而且效率最高。

4. 为什么JDK的Boolean没有实现上面第3点?因为那两个static变量TRUE和FALSE是在jdk 1.2以后才有的,由于前面的版本已经把构造函数申明为public,所以为了保持客户端代码能够不修改也在后面的版本中运行,只好继续提供public 构造函数。

<think>我们正在处理用户关于OpenTCS源码解读、分析、文档和教程的请求。根据提供的引用内容,我们可以整合以下信息:1.引用[1]提到在IDEA中运行OpenTCS的kernel、editor、desk、controller模块,并参考了之前的部署指南。2.引用[2]详细说明了OpenTCS的RMI接口,允许用户自定义UI,同时提到了官方文档中的RMI接口。3.引用[3]介绍了VDA5050标准,虽然与OpenTCS没有直接关系,但可以作为AGV通信的参考。用户的需求是获取OpenTCS源码解读和分析资料。因此,我们需要重点围绕源码结构、模块功能、RMI接口和自定义开发等方面进行解答。由于OpenTCS是一个开源项目,其源码和文档可以在GitHub上找到。我们可以引导用户查阅官方文档和源码,同时提供一些关键点的解读。回答结构:1.介绍OpenTCS源码的获取方式。2.解读主要模块的功能(kernel,editor,desk,controller)。3.分析RMI接口,如何用于自定义UI开发。4.提供学习资源建议(官方文档、示例、社区)。同时,根据要求生成相关问题。</think>### OpenTCS源码解读与分析 OpenTCS是一个开源的自动导引车(AGV)调度系统,其源码结构清晰但涉及模块较多。以下是关键模块的解读与分析: #### 1. **核心模块功能** - **Kernel**:调度核心,负责路径规划、任务分配和资源管理。核心算法包括`Dijkstra`最短路径算法和任务优先级队列[^2]。 - **Editor**:图形化建模工具,用于创建地图、设置路径规则。采用Swing UI框架,地图数据以XML存储。 - **Desk & Controller**:控制台模块,通过RMI(远程方法调用)与Kernel通信,实现车辆状态监控和指令下发[^1]。 #### 2. **RMI通信接口(关键扩展点)** OpenTCS通过RMI暴露接口供外部系统集成,例如自定义UI或业务逻辑: ```java // 示例:获取车辆状态的RMI接口 VehicleService vehicleService = (VehicleService) registry.lookup("VehicleService"); List<Vehicle> vehicles = vehicleService.getVehicles(); // 实时获取所有AGV状态 ``` 常用接口包括: - `VehicleService`:车辆状态查询、指令下发(如`sendMovementCommand()`) - `TransportOrderService`:任务管理(创建/取消订单) - `PeripheralService`:外围设备控制(如充电桩)[^2] #### 3. **自定义开发指南** - **业务集成**:通过RMI接口连接自有系统,覆盖原生UI(如替换Desk模块)[^2]。 - **车辆适配器**:需实现`VehicleCommAdapter`接口,处理协议解析(如VDA5050标准)[^3]。 - **扩展点**:事件监听器(`KernelEventHandler`)可捕获任务状态变更事件,触发业务逻辑。 #### 4. **学习资源推荐** - **官方文档**:[OpenTCS RMI接口文档](https://docs.opentcs.org/)(详细说明各服务类) - **源码示例**:`openTCS-demo`项目提供适配器实现样例(如TCP/UDP通信)。 - **调试建议**:在IDEA中依次启动`kernel → editor → desk → controller`模块[^1],结合日志分析流程。 --- ### 相关问题 1. **如何实现OpenTCS与自定义协议的AGV通信?** 2. **OpenTCS的路径冲突避免算法是如何设计的?** 3. **能否用OpenTCS集成第三方仓储管理系统?具体步骤是什么?** 4. **OpenTCS的性能瓶颈通常出现在哪些模块?如何优化?** > 提示:深入源码时,建议优先阅读`org.opentcs.kernel`和`org.opentcs.util`包,这两个模块包含核心调度逻辑和工具类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值