いろんな定数を宣言

まずは普通に

よく使うのが、プリミティブと文字列の定数

public class Const {
    private static final int MAX_INT = 100;
    private static final String NAME = "name";
}

Mapを定数に

あんまり使う場面は無いかもしれないけど、こんな感じ

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class AnimalMain {
    private static final Map ANIMAL_MAP;
    static {
        HashMap map = new HashMap();
        map.put("dog", "pochi");
        map.put("cat", "tama");
        ANIMAL_MAP = Collections.unmodifiableMap(map);
    }
    public static void main(String[] args) {
        ANIMAL_MAP.put("mouse", "hamtaro");
    }
}

Mapの場合はfinalにしても追加・変更はできるのでCollections#unmodifiableMapで追加をできないようにしておくと、変なことにはならないはず。
ただ、取得してきたインスタンスの変更はできてしまうので、結局、クラスは定数に使わないほうがいいかも…

ちなみに実行すると、UnsupportedOperationExceptionが発生。

java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableMap.put(Unknown Source)
    at AnimalMain.main(AnimalMain.java:15)
Exception in thread "main" 

Listを定数に

Mapとほぼ同じ

        ANIMAL_LIST = Collections.unmodifiableList(list);

その他のクラスを定数化

Collections#unmodifiableMapのなかを見てみると、定数かしたいクラスをラップして、変更メソッドに例外を埋め込んでるようなので、こんな感じか。

// 定数として使うクラス
public class Animal {

    private String name;

    private int size;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
}

public class AnimalUtil {
    // 変更不可にするメソッド
    public Animal unmodifiable(Animal animal) {
        return new UnmodifiableAnimal(animal);
    }

    // ラッパクラス
    private static class UnmodifiableAnimal extends Animal {
        private final Animal animal;

        // コンストラクタ
        UnmodifiableAnimal(Animal animal) {
            this.animal = animal;
        }

        // インスタンスが変更されないメソッドは委譲
        public boolean equals(Object obj) { return animal.equals(obj);}
        public String getName() {           return animal.getName();}
        public int getSize() {              return animal.getSize();}
        public int hashCode() {             return animal.hashCode();}
        public String toString() {          return animal.toString();}

        // インスタンスが変更されるメソッドは例外
        public void setName(String name) {  throw new UnsupportedOperationException();}
        public void setSize(int size) {     throw new UnsupportedOperationException();}
    }
}

結論

クラスは定数化しないほうがいいんじゃない?