content: /**
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package com.aliyun.odps.io;
  
  import java.io.DataInput;
  import java.io.DataOutput;
  import java.io.IOException;
  
  /**
   * NullWritable 提供了 null （空值）的 {@link Writable} 和 {@link WritableComparable}
   * 的实现.
   *
   * <p>
   * NullWritable 使用单子模式，不允许自行创建，只能通过 {@link #get()} 方法取得。
   */
  @SuppressWarnings("rawtypes")
  public class NullWritable implements WritableComparable {
  
    private static final NullWritable THIS = new NullWritable();
  
    private NullWritable() {
    } // no public ctor
  
    /**
     * 获取 NullWritable 实例.
     *
     * <p>
     * NullWritable 使用单子模式，不允许自行创建，只能通过本方法取得。
     *
     * @return NullWritable 实例
     */
    public static NullWritable get() {
      return THIS;
    }
  
    @Override
    public String toString() {
      return "(null)";
    }
  
    /**
     * 返回哈希值 0.
     */
    @Override
    public int hashCode() {
      return 0;
    }
  
    /**
     * 比较两个 NullWritable 的值.
     *
     * @param other
     *     比较对象
     * @return 如果 other 也为 NullWritable，返回0，否则抛 {@link ClassCastException} 异常
     */
    @Override
    public int compareTo(Object other) {
      if (!(other instanceof NullWritable)) {
        throw new ClassCastException("can't compare "
                                     + other.getClass().getName() + " to NullWritable");
      }
      return 0;
    }
  
    /**
     * 判断两个对象是否相等.
     *
     * @param other
     *     比较对象
     * @return 如果 other 也为 NullWritable，返回true，否则，返回false
     */
    @Override
    public boolean equals(Object other) {
      return other instanceof NullWritable;
    }
  
    /**
     * NullWritable 不读入任何内容
     */
    @Override
    public void readFields(DataInput in) throws IOException {
    }
  
    /**
     * NullWritable 不输出任何内容
     */
    @Override
    public void write(DataOutput out) throws IOException {
    }
  
    /**
     * NullWritable 对象的 {@link WritableComparator} 实现.
     */
    public static class Comparator extends WritableComparator {
  
      public Comparator() {
        super(NullWritable.class);
      }
  
      /**
       * 基于二进制内容的 NullWritable 对象比较函数.
       */
      @Override
      public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
        assert 0 == l1;
        assert 0 == l2;
        return 0;
      }
    }
  
    static { // register this comparator
      WritableComparator.define(NullWritable.class, new Comparator());
    }
  }
  