/*
* 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;
/**
* Représentation d'un préfix du système métrique. Un objet Prefix
* peut par exemple représenter des "centi" (symbole "c") comme dans "centimètres"
* (symbole "cm"). La description du paquet org.geotools.units
donne
* une liste des préfix standards du système SI.
*
*
Note: this class has a natural ordering that is inconsistent with equals. * La méthode {@link #compareTo} ne compare que le champ {@link #amount}, tandis * que la méthode {@link #equals} compare tous les champs ({@link #name}, * {@link #symbol} et {@link #amount}).
* * @version 1.0 * @author Martin Desruisseaux * * @deprecated Replaced by the {@link javax.units.Unit} framework. */ /*public*/ final class Prefix implements Comparable, Serializable { /** * Serial number for interoperability with different versions. */ private static final long serialVersionUID = 3289659964721709283L; /** * Banque des objets qui ont été précédemment créés et * enregistrés par un appel à la méthode {@link #intern}. */ static final WeakHashSet pool=new WeakHashSet(); /** * Nom neutre du préfix. Le système SI définit plusieurs noms de préfix, parmi lesquels on trouve * "milli", "centi" et "kilo". Certaines unités (notamment des unités du type {@link ScaledUnit}) * pourront combiner leurs noms avec un nom de préfix. Par exemple le préfix "centi" (symbole "c") * pourra être combiné avec les unités "mètres" (symbole "m") pour former les "centimètres" (symbole * "cm"). La chaînename
peut être vide, mais ne sera jamais nulle. Notez enfin que
* name
est "language-neutral". Pour obtenir un nom dans la langue de l'utilisateur,
* utilisez la méthode {@link #getLocalizedName}.
*/
public final String name;
/**
* Symbole du préfix. La plupart des symboles de préfix n'ont qu'une seule lettre. Il s'agit
* la plupart du temps de la première lettre de name
, parfois en majuscule. Les
* majuscules et minuscules sont significatifs et très importants. Par exemple le symbole "m"
* est pour "milli" tandis que le symbole "M" est pour "mega".
*/
public final String symbol;
/**
* Quantité représenté par ce préfix. Pour les préfix SI, cette quantité est toujours une puissance de 10.
* Par exemple pour les "kilo" (symbole 'k'), la quantité amount
est 1000. Cette quantité ne
* sera jamais NaN
ni infinie.
*/
public final double amount;
/**
* Construit un préfix temporaire. Ce constructeur ne sert qu'à effectuer
* des recherches dans une liste de préfix par {@link PrefixSet}.
*/
Prefix(final double amount) {
this.name = "";
this.symbol = "";
this.amount = amount;
}
/**
* Construit un nouveau préfix.
*
* @param name Nom du préfix (par exemple "centi" comme dans "centimètres").
* @param symbol Symbole du préfix (par exemple "c" pour "centimètres").
* @param amount Quantité représenté par ce préfix (par exemple 0.01 pour "c").
*/
private Prefix(final String name, final String symbol, final double amount) {
this.name = name.trim();
this.symbol = symbol.trim();
this.amount = amount;
if (!(amount>0) || Double.isInfinite(amount)) {
throw new IllegalArgumentException();
}
}
/**
* Construit un nouveau préfix.
*
* @param name Nom du préfix (par exemple "centi" comme dans "centimètres").
* @param symbol Symbole du préfix (par exemple "c" pour "centimètres").
* @param amount Quantité représenté par ce préfix (par exemple 0.01 pour "c").
*/
public static Prefix getPrefix(final String name, final String symbol, final double amount) {
return new Prefix(name, symbol, amount).intern();
}
/**
* Retourne le nom du préfix dans la langue de l'utilisateur.
* Par exemple le préfix "deci" est écrit "déci" en français.
*/
public String getLocalizedName() {
return org.geotools.resources.units.Prefix.localize(name);
}
/**
* Retourne le symbole du préfix. Cette méthode retourne
* systématiquement le champ {@link #symbol}.
*/
public String toString() {
return symbol;
}
/**
* Compare deux préfix. Cette méthode compare les quantités {@link #amount} de façon à permettre un classement
* des préfix en ordre croissant de quantité. Contrairement à la méthode {@link #equals}, compareTo
* ne compare pas les noms et symboles des préfix. Ainsi, deux préfix représentant la même quantité mais avec
* des symboles différents seront considérés égaux par compareTo
.
*/
public int compareTo(final Object object) {
final Prefix that = (Prefix) object;
if (this.amount > that.amount) return +1;
if (this.amount < that.amount) return -1;
return 0;
}
/**
* Indique si ce préfix est identique à l'objet spécifié.
* Cette méthode retourne true
si object
est aussi un
* objet Prefix
et si les deux préfix ont les mêmes nom et symbole
* et représentent la même quantité {@link #amount}.
*/
public boolean equals(final Object object) {
if (object==this) {
return true; // slight optimisation
}
if (object instanceof Prefix) {
final Prefix prefix = (Prefix) object;
return Double.doubleToLongBits(amount)==Double.doubleToLongBits(prefix.amount) &&
symbol .equals (prefix.symbol) &&
name .equals (prefix.name);
}
return false;
}
/**
* Retourne un code représentant ce préfix.
*/
public int hashCode() {
final long code=Double.doubleToLongBits(amount);
return (int) code ^ (int) (code >>> 32);
}
/**
* Retourne un exemplaire unique de ce préfix. Une banque de préfix, initialement
* vide, est maintenue de façon interne par la classe Prefix
. Lorsque
* la méthode intern
est appelée, elle recherchera un préfix égale à
* this
au sens de la méthode {@link #equals}. Si un tel préfix est
* trouvé, il sera retourné. Sinon, le préfix this
sera ajouté à la
* banque de données en utilisant une référence faible et cette méthode retournera
* this
.
* u.intern()==v.intern()
sera vrai si et seulement si
* u.equals(v)
est vrai.
*/
private final Prefix intern() {
return (Prefix) pool.canonicalize(this);
}
/**
* Après la lecture d'une unité, vérifie si ce préfix
* apparaît déjà dans la banque des préfix. Si oui,
* l'exemplaire de la banque sera retourné plutôt
* que de garder inutilement le préfix courant comme copie.
*/
final Object readResolve() throws ObjectStreamException {
return intern();
}
}