File

packages/java.lang/src/jobject.ts

Description

Class {@code JObject} is the root of the class hierarchy.
Every class has {@code JObject} as a superclass. All objects,
including arrays, implement the methods of this class.

Constructor

constructor()

Methods

Public getClass
getClass()

Returns the runtime class of this {@code JObject}. The returned
{@code Class} object is the object that is locked by {@code
static synchronized} methods of the represented class.

The actual result type is {@code Class<? extends |X|>}
where {@code |X|} is the erasure of the static type of the
expression on which {@code getClass} is called.
For
example, no cast is required in this code fragment:


{@code Number n = 0; }

{@code Class<? extends Number> c = n.getClass(); }

Returns: void
Public hashCode
hashCode()

Returns a hash code _value for the object. This method is
supported for the benefit of hash tables such as those provided by
{@link java.util.HashMap}.


The general contract of {@code hashCode} is:

  • Whenever it is invoked on the same object more than once during
    an execution of a Java application, the {@code hashCode} method
    must consistently return the same integer, provided no information
    used in {@code equals} comparisons on the object is modified.
    This integer need not remain consistent from one execution of an
    application to another execution of the same application.

  • If two objects are equal according to the {@code equals(JObject)}
    method, then calling the {@code hashCode} method on each of
    the two objects must produce the same integer result.

  • It is not required that if two objects are unequal
    according to the {@link java.lang.JObject#equals(java.lang.JObject)}
    method, then calling the {@code hashCode} method on each of the
    two objects must produce distinct integer results. However, the
    programmer should be aware that producing distinct integer results
    for unequal objects may improve the performance of hash tables.


As much as is reasonably practical, the hashCode method defined by
class {@code JObject} does return distinct integers for distinct
objects. (This is typically implemented by converting the internal
address of the object into an integer, but this implementation
technique is not required by the
Java™ programming language.)

Returns: Jint
Public equals
equals(obj: JObject)

Indicates whether some other object is "equal to" this one.


The {@code equals} method implements an equivalence relation
on non-null object references:

  • It is reflexive: for any non-null reference _value
    {@code x}, {@code x.equals(x)} should return
    {@code true}.

  • It is symmetric: for any non-null reference values
    {@code x} and {@code y}, {@code x.equals(y)}
    should return {@code true} if and only if
    {@code y.equals(x)} returns {@code true}.

  • It is transitive: for any non-null reference values
    {@code x}, {@code y}, and {@code z}, if
    {@code x.equals(y)} returns {@code true} and
    {@code y.equals(z)} returns {@code true}, then
    {@code x.equals(z)} should return {@code true}.

  • It is consistent: for any non-null reference values
    {@code x} and {@code y}, multiple invocations of
    {@code x.equals(y)} consistently return {@code true}
    or consistently return {@code false}, provided no
    information used in {@code equals} comparisons on the
    objects is modified.

  • For any non-null reference _value {@code x},
    {@code x.equals(null)} should return {@code false}.


The {@code equals} method for class {@code JObject} implements
the most discriminating possible equivalence relation on objects;
that is, for any non-null reference values {@code x} and
{@code y}, this method returns {@code true} if and only
if {@code x} and {@code y} refer to the same object
({@code x == y} has the _value {@code true}).


Note that it is generally necessary to override the {@code hashCode}
method whenever this method is overridden, so as to maintain the
general contract for the {@code hashCode} method, which states
that equal objects must have equal hash codes.

Parameters :
  • obj

    the reference object with which to compare.

Returns: Jboolean
Protected clone
clone()

Creates and returns a copy of this object. The precise meaning
of "copy" may depend on the class of the object. The general
intent is that, for any object {@code x}, the expression:


x.clone() != x

will be true, and that the expression:


x.clone().getClass() == x.getClass()

will be {@code true}, but these are not absolute requirements.
While it is typically the case that:


x.clone().equals(x)

will be {@code true}, this is not an absolute requirement.


By convention, the returned object should be obtained by calling
{@code super.clone}. If a class and all of its superclasses (except
{@code JObject}) obey this convention, it will be the case that
{@code x.clone().getClass() == x.getClass()}.


By convention, the object returned by this method should be independent
of this object (which is being cloned). To achieve this independence,
it may be necessary to modify one or more fields of the object returned
by {@code super.clone} before returning it. Typically, this means
copying any mutable objects that comprise the internal "deep structure"
of the object being cloned and replacing the references to these
objects with references to the copies. If a class contains only
primitive fields or references to immutable objects, then it is usually
the case that no fields in the object returned by {@code super.clone}
need to be modified.


The method {@code clone} for class {@code JObject} performs a
specific cloning operation. First, if the class of this object does
not implement the interface {@code Cloneable}, then a
{@code CloneNotSupportedException} is thrown. Note that all arrays
are considered to implement the interface {@code Cloneable} and that
the return type of the {@code clone} method of an array type {@code T[]}
is {@code T[]} where T is any reference or primitive type.
Otherwise, this method creates a new instance of the class of this
object and initializes all its fields with exactly the contents of
the corresponding fields of this object, as if by assignment; the
contents of the fields are not themselves cloned. Thus, this method
performs a "shallow copy" of this object, not a "deep copy" operation.


The class {@code JObject} does not itself implement the interface
{@code Cloneable}, so calling the {@code clone} method on an object
whose class is {@code Object} will result in throwing an
exception at run time.

Returns: JObject
Public toString
toString()

Returns a string representation of the object. In general, the
{@code toString} method returns a string that
"textually represents" this object. The result should
be a concise but informative representation that is easy for a
person to read.
It is recommended that all subclasses override this method.


The {@code toString} method for class {@code JObject}
returns a string consisting of the name of the class of which the
object is an instance, the at-sign character `{@code @}', and
the unsigned hexadecimal representation of the hash code of the
object. In other words, this method returns a string equal to the
_value of:



getClass().getName() + '@' + Integer.toHexString(hashCode())
Returns: string
Public eq
eq(expr: JObject)
Returns: Jboolean
Public ne
ne(expr: JObject)
Returns: Jboolean
Public instanceof
instanceof(expr: typeof JObject)

Emulate the operator instanceof

Returns: Jboolean
import {JEquality} from '@j2se-js/java.lang.native.operator';

import {Jboolean, jboolean} from './jboolean_primitive';
import {Jint, jint} from './jint_primitive';

/**
 * Class {@code JObject} is the root of the class hierarchy.
 * Every class has {@code JObject} as a superclass. All objects,
 * including arrays, implement the methods of this class.
 *
 * @author  unascribed
 * @see     java.lang.Class
 * @since   JDK1.0
 */
export class JObject implements JEquality<JObject> {
  private static uidGenerator = 0;
  private uid: Jint;

  public constructor() {
    // if (JClassLoader[this.constructor.toString()] === undefined) {
    //   JClassLoader[this.constructor.toString()] = JClass.get(this.constructor);
    // }

    this.uid = jint((++JObject.uidGenerator).toString());
  }

  /**
   * Returns the runtime class of this {@code JObject}. The returned
   * {@code Class} object is the object that is locked by {@code
   * static synchronized} methods of the represented class.
   *
   * <p><b>The actual result type is {@code Class<? extends |X|>}
   * where {@code |X|} is the erasure of the static type of the
   * expression on which {@code getClass} is called.</b> For
   * example, no cast is required in this code fragment:</p>
   *
   * <p>
   * {@code Number n = 0;                             }<br>
   * {@code Class<? extends Number> c = n.getClass(); }
   * </p>
   *
   * @return The {@code Class} object that represents the runtime
   *         class of this object.
   * @jls 15.8.2 Class Literals
   */
  public getClass() {
    // TODO must return JClass
    throw Error('not yet implemented');
  }


  /**
   * Returns a hash code _value for the object. This method is
   * supported for the benefit of hash tables such as those provided by
   * {@link java.util.HashMap}.
   * <p>
   * The general contract of {@code hashCode} is:
   * <ul>
   * <li>Whenever it is invoked on the same object more than once during
   *     an execution of a Java application, the {@code hashCode} method
   *     must consistently return the same integer, provided no information
   *     used in {@code equals} comparisons on the object is modified.
   *     This integer need not remain consistent from one execution of an
   *     application to another execution of the same application.
   * <li>If two objects are equal according to the {@code equals(JObject)}
   *     method, then calling the {@code hashCode} method on each of
   *     the two objects must produce the same integer result.
   * <li>It is <em>not</em> required that if two objects are unequal
   *     according to the {@link java.lang.JObject#equals(java.lang.JObject)}
   *     method, then calling the {@code hashCode} method on each of the
   *     two objects must produce distinct integer results.  However, the
   *     programmer should be aware that producing distinct integer results
   *     for unequal objects may improve the performance of hash tables.
   * </ul>
   * <p>
   * As much as is reasonably practical, the hashCode method defined by
   * class {@code JObject} does return distinct integers for distinct
   * objects. (This is typically implemented by converting the internal
   * address of the object into an integer, but this implementation
   * technique is not required by the
   * Java&trade; programming language.)
   *
   * @return  a hash code _value for this object.
   * @see     java.lang.JObject#equals(java.lang.JObject)
   * @see     java.lang.System#identityHashCode
   */
  public hashCode(): Jint {
    return this.uid;
  }


  /**
   * Indicates whether some other object is "equal to" this one.
   * <p>
   * The {@code equals} method implements an equivalence relation
   * on non-null object references:
   * <ul>
   * <li>It is <i>reflexive</i>: for any non-null reference _value
   *     {@code x}, {@code x.equals(x)} should return
   *     {@code true}.
   * <li>It is <i>symmetric</i>: for any non-null reference values
   *     {@code x} and {@code y}, {@code x.equals(y)}
   *     should return {@code true} if and only if
   *     {@code y.equals(x)} returns {@code true}.
   * <li>It is <i>transitive</i>: for any non-null reference values
   *     {@code x}, {@code y}, and {@code z}, if
   *     {@code x.equals(y)} returns {@code true} and
   *     {@code y.equals(z)} returns {@code true}, then
   *     {@code x.equals(z)} should return {@code true}.
   * <li>It is <i>consistent</i>: for any non-null reference values
   *     {@code x} and {@code y}, multiple invocations of
   *     {@code x.equals(y)} consistently return {@code true}
   *     or consistently return {@code false}, provided no
   *     information used in {@code equals} comparisons on the
   *     objects is modified.
   * <li>For any non-null reference _value {@code x},
   *     {@code x.equals(null)} should return {@code false}.
   * </ul>
   * <p>
   * The {@code equals} method for class {@code JObject} implements
   * the most discriminating possible equivalence relation on objects;
   * that is, for any non-null reference values {@code x} and
   * {@code y}, this method returns {@code true} if and only
   * if {@code x} and {@code y} refer to the same object
   * ({@code x == y} has the _value {@code true}).
   * <p>
   * Note that it is generally necessary to override the {@code hashCode}
   * method whenever this method is overridden, so as to maintain the
   * general contract for the {@code hashCode} method, which states
   * that equal objects must have equal hash codes.
   *
   * @param   obj   the reference object with which to compare.
   * @return  {@code true} if this object is the same as the obj
   *          argument; {@code false} otherwise.
   * @see     #hashCode()
   * @see     java.util.HashMap
   */
  public equals(obj: JObject): Jboolean {
    return this.eq(obj);
  }

  /**
   * Creates and returns a copy of this object.  The precise meaning
   * of "copy" may depend on the class of the object. The general
   * intent is that, for any object {@code x}, the expression:
   * <blockquote>
   * <pre>
   * x.clone() != x</pre></blockquote>
   * will be true, and that the expression:
   * <blockquote>
   * <pre>
   * x.clone().getClass() == x.getClass()</pre></blockquote>
   * will be {@code true}, but these are not absolute requirements.
   * While it is typically the case that:
   * <blockquote>
   * <pre>
   * x.clone().equals(x)</pre></blockquote>
   * will be {@code true}, this is not an absolute requirement.
   * <p>
   * By convention, the returned object should be obtained by calling
   * {@code super.clone}.  If a class and all of its superclasses (except
   * {@code JObject}) obey this convention, it will be the case that
   * {@code x.clone().getClass() == x.getClass()}.
   * <p>
   * By convention, the object returned by this method should be independent
   * of this object (which is being cloned).  To achieve this independence,
   * it may be necessary to modify one or more fields of the object returned
   * by {@code super.clone} before returning it.  Typically, this means
   * copying any mutable objects that comprise the internal "deep structure"
   * of the object being cloned and replacing the references to these
   * objects with references to the copies.  If a class contains only
   * primitive fields or references to immutable objects, then it is usually
   * the case that no fields in the object returned by {@code super.clone}
   * need to be modified.
   * <p>
   * The method {@code clone} for class {@code JObject} performs a
   * specific cloning operation. First, if the class of this object does
   * not implement the interface {@code Cloneable}, then a
   * {@code CloneNotSupportedException} is thrown. Note that all arrays
   * are considered to implement the interface {@code Cloneable} and that
   * the return type of the {@code clone} method of an array type {@code T[]}
   * is {@code T[]} where T is any reference or primitive type.
   * Otherwise, this method creates a new instance of the class of this
   * object and initializes all its fields with exactly the contents of
   * the corresponding fields of this object, as if by assignment; the
   * contents of the fields are not themselves cloned. Thus, this method
   * performs a "shallow copy" of this object, not a "deep copy" operation.
   * <p>
   * The class {@code JObject} does not itself implement the interface
   * {@code Cloneable}, so calling the {@code clone} method on an object
   * whose class is {@code Object} will result in throwing an
   * exception at run time.
   *
   * @return     a clone of this instance.
   * @throws  CloneNotSupportedException  if the object's class does not
   *               support the {@code Cloneable} interface. Subclasses
   *               that override the {@code clone} method can also
   *               throw this exception to indicate that an instance cannot
   *               be cloned.
   * @see java.lang.Cloneable
   */
  protected clone(): JObject {
    // if the class of this object does not implement the interface Cloneable,
    // then a CloneNotSupportedException is thrown
    throw new Error('JCloneNotSupportedException')    // TODO JCloneNotSupportedException
  }

  /**
   * Returns a string representation of the object. In general, the
   * {@code toString} method returns a string that
   * "textually represents" this object. The result should
   * be a concise but informative representation that is easy for a
   * person to read.
   * It is recommended that all subclasses override this method.
   * <p>
   * The {@code toString} method for class {@code JObject}
   * returns a string consisting of the name of the class of which the
   * object is an instance, the at-sign character `{@code @}', and
   * the unsigned hexadecimal representation of the hash code of the
   * object. In other words, this method returns a string equal to the
   * _value of:
   * <blockquote>
   * <pre>
   * getClass().getName() + '@' + Integer.toHexString(hashCode())
   * </pre></blockquote>
   *
   * @return  a string representation of the object.
   */
  public toString(): string {
    // TODO must use getClass()
    // TODO must return JString
    return `java.lang.Object@${this.hashCode()}`;
  }

  public eq(expr: JObject): Jboolean {
    return jboolean((this === expr).toString());
  }

  public ne(expr: JObject): Jboolean {
    return jboolean((this !== expr).toString());
  }

  /** Emulate the operator instanceof */
  public instanceof(expr: typeof JObject): Jboolean {
    return jboolean((this instanceof expr).toString());
  }
}

results matching ""

    No results matching ""