class AbstractColumnType implements ColumnType {

  private final int byteSize;

  private final String name;

  private final String printerFriendlyName;

  protected AbstractColumnType(int byteSize, String name, String printerFriendlyName) {
    this.byteSize = byteSize;
    this.name = name;
    this.printerFriendlyName = printerFriendlyName;
    ColumnType.register(this);
  }

  /** {@inheritDoc} */
  @Override
  public String toString() {
    return name;
  }

  /** {@inheritDoc} */
  @Override
  public String name() {
    return name;
  }

  /** {@inheritDoc} */
  public int byteSize() {
    return byteSize;
  }

  /** {@inheritDoc} */
  @Override
  public String getPrinterFriendlyName() {
    return printerFriendlyName;
  }

  /** {@inheritDoc} */
  @Override
  public boolean equals(Object o) {<FILL_FUNCTION_BODY>}

  /** {@inheritDoc} */
  @Override
  public int hashCode() {
    return Objects.hashCode(byteSize, name, printerFriendlyName);
  }
}

    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    AbstractColumnType that = (AbstractColumnType) o;
    return byteSize == that.byteSize
        && Objects.equal(name, that.name)
        && Objects.equal(printerFriendlyName, that.printerFriendlyName);
  
<no_super_class>