/* * Units - Temporary implementation for Geotools 2 * Copyright (C) 1998 University Corporation for Atmospheric Research (Unidata) * 1998 Bill Hibbard & al. (VisAD) * 1999 Pêches et Océans Canada * 2000 Institut de Recherche pour le Développement * 2002 Centre for Computational Geography * * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details (http://www.gnu.org/). * * * This package is inspired from the units package of VisAD. * Unidata and Visad's work is fully acknowledged here. * * THIS IS A TEMPORARY CLASS * * This is a placeholder for future Unit class. * This skeleton will be removed when the real classes from * JSR-108: Units specification will be publicly available. */ package org.geotools.units; // Entrés/sorties import java.io.ObjectStreamException; import java.io.Serializable; import org.geotools.util.WeakHashSet; /** * Classe représentant une unité de base et la valeur de son exposant. * Cette classe est utilisée en argument par la méthode {@link DerivedUnit#getInstance}. * Elle n'a pas de constructeur publique; il n'existe pas d'autres moyen de créer de * nouveaux objets Factor que d'utiliser la méthode statique * {@link #getFactor}. * * @version 1.0 * @author Steven R. Emmerson * @author Bill Hibbard * @author Martin Desruisseaux * * @deprecated Replaced by the {@link javax.units.Unit} framework. */ /*public*/ final class Factor implements Serializable { /** * Serial number for interoperability with different versions. */ private static final long serialVersionUID = -7448171508684390207L; /** * Banque des objets qui ont été précédemment créés et * enregistrés par un appel à la méthode {@link #intern}. */ private static final WeakHashSet pool=Prefix.pool; /** * L'unité de base de ce facteur. */ public final BaseUnit baseUnit; /** * La valeur de l'exposant associée * à l'unité de base de ce facteur. */ public final int power; /** * Construit un facteur qui représentera une * unité de base élevée à la puissance spécifiée. * * @param baseUnit L'unité de base. * @param power La puissance à laquelle élever l'unité de base. */ private Factor(final BaseUnit baseUnit, final int power) { if (baseUnit!=null) { this.baseUnit = baseUnit; this.power = power; } else { throw new NullPointerException(); } } /** * Retourne un facteur qui représentera une * unité de base élevée à la puissance spécifiée. * * @param baseUnit L'unité de base. * @param power La puissance à laquelle élever l'unité de base. */ public static Factor getFactor(final BaseUnit baseUnit, final int power) { return new Factor(baseUnit, power).intern(); } /** * Retourne un facteur dont l'exposant de l'unité * est de signe inverse de celui de ce facteur. */ public final Factor inverse() { return getFactor(baseUnit, -power); } /** * Retourne le symbole de ce facteur. Ce sera le * symbole de l'unité de base avec son exposant. * Par exemple "m", "m²" ou "kg^-1". */ public String toString() { return UnitFormat.DEFAULT.format(this, new StringBuffer()).toString(); } /** * Indique si ce facteur est identique ou réciproque au facteur spécifié. * * @param that L'autre facteur (peut être nul). * @return +1 Si les deux facteurs sont identiques.
* -1 Si les deux facteurs sont réciproques (par exemple s et 1/s).
* 0 Si les deux facteurs ne sont ni identiques ni réciproques, ou si that est nul. */ final int compareDimensionality(final Factor that) { if (that!=null && baseUnit.equals(that.baseUnit)) { if (power == +that.power) return +1; if (power == -that.power) return -1; } return 0; } /** * Vérifie si ce facteur est identique au facteur spécifié. Cette méthode retourne true * si les deux facteurs utilisent les mêmes unités {@link #baseUnits} avec la même puissance {@link * #power}. */ final boolean equals(final Factor factor) { return power==factor.power && baseUnit.equals(factor.baseUnit); } /** * Vérifie si ce facteur est identique à l'objet spécifié. Cette méthode retourne true * si object est aussi un objet Factor et si les deux facteurs utilisent * les mêmes unités {@link #baseUnit} avec la même puissance {@link #power}. */ public boolean equals(final Object object) { return (object==this) || // slight optimisation ((object instanceof Factor) && equals((Factor) object)); } /** * Retourne un code à peu près * unique pour ce facteur. */ public int hashCode() { return baseUnit.hashCode()+power; } /** * Retourne un exemplaire unique de ce facteur. Une banque de facteurs, initialement * vide, est maintenue de façon interne par la classe Unit. Lorsque la * méthode intern est appelée, elle recherchera un facteur égale à * this au sens de la méthode {@link #equals}. Si un tel facteur est * trouvé, il sera retourné. Sinon, le facteur this sera ajouté à la * banque de données en utilisant une référence faible et cette méthode retournera * this. *

* De cette méthode il s'ensuit que pour deux facteurs u et v, * la condition u.intern()==v.intern() sera vrai si et seulement si * u.equals(v) est vrai. */ private final Factor intern() { return (Factor) pool.canonicalize(this); } /** * Après la lecture d'un facteur, vérifie si ce facteur * apparaît déjà dans la banque {@link Unit#pool}. * Si oui, l'exemplaire de la banque sera retourné plutôt * que de garder inutilement le facteur courant comme copie. */ final Object readResolve() throws ObjectStreamException { return intern(); } }