A NICE egy új, általános célú, objektum-orientált programozási nyelv, amely magába foglalja a funkcionális programozás néhány nyelvi elemét is. A nyelv szintaxisa és szemantikája a JAVA nyelv alapjaira támaszkodik, azonban ahhoz számos új tulajdonságot ad, illetve azon számos helyen változtat. Fejlesztőinek fő célkitűzése, hogy a meglévő objektumorientált nyelvek eszközkészletének a bővítésével egy olyan programozási eszközt hozzanak létre, amely biztonságosabb, jobban támogatja a modularitást, és nagyobb kifejezőerővel rendelkezik.
A NICE biztonságot támogató módszerei azok az alapvető elemek, amelyek ma már a legtöbb modern programozási nyelvben megtalálhatóak:
A nyelv szintén figyelmet fordít a (főként objektumszintű, futásidejű) típuskonverziók („casting”) megvalósítására is, és olyan típusrendszerrel rendelkezik, amelyben nincs is szükség kifejezett, explicit típuskonverziókra. A JAVA egyik legnagyobb hibája (volt - a legújabb 5.0-ás verzió már azóta orvosolta ezt), hogy nem rendelkezett olyan típussal paraméterezhető típuskonstrukciókkal (template-ek, generic-ek), amelyek lehetővé tennék, hogy általános felhasználhatóságú osztályokat valósítsunk meg benne erős típusellenőrzés mellett. (Az ennek következtében fellépő esetleges „ClassCastException” típusú hibajelenségek szintén nem fordulhatnak elő a NICE nyelvben.)
A NICE a modularitás támogatására rendelkezik a csomagok (package) fogalmával is, amely bár hasonló a JAVA nyelvben megtalálhatóhoz, azzal mégsem azonos. Ennek fő oka az, hogy a NICE lehetőséget ad arra is, hogy új metódusokat adjunk már létező osztályokhoz anélkül, hogy a meglévő osztály forráskódján változtatnunk kellene. (Ez az un. „multi-methods” speciális esete).
A NICE nyelv ezen kívül számos olyan kiterjesztett lehetőséggel rendelkezik, amelyek megnövelve kifejezőerejét, lehetővé teszik, hogy kevesebb kóddal írjunk le egy egy eljárást vagy függvényt. Ilyen lehetőség például a már említett paraméterezett típusok használata, amely a konténer típusok megvalósításánál és használatánál jelent előnyöket. (A beépített típusok „dobozolását” a fordítóprogram automatikusan elvégzi ebben a kontextusban, így azok is biztonságosan használhatóak polimorfikus kódokban). Lehetőség van névtelen függvények (anonymous functions) használatára, amelyek megvalósítása a LISP, illetve ML nyelvekhez hasonló módon történik. Ez sokkal rugalmasabb a JAVA hasonló lehetőségeinél, például egy „GUI listener” megvalósításakor.
A már korábban említett multi-metódusok szerepe az, hogy a már meglévő típusokat új műveletekkel tudjuk bővíteni. Ehhez hasonló funkcionalitást el lehet ugyan érni a JAVA-ban az un. látogató („visitor”) tervminta megvalósításával, azonban ennek lehetőségét nyelvi elemként bevezetve a NICE sokkal kompaktabb és átláthatóbb módon teszi ezt lehetővé.
Lehetőség van a nyelvben „rendezett n-esek” (tuples) használatára is (hasonlóan egyes scriptnyelvekhez, mint például a Python), amelyek logikailag és szintaktikusan összefűzhetnek több adattípusból álló elemeket is, lehetővé téve egyfajta „anonim struktúrák” használatát például a paraméterátadásoknál, amikor egynél több paramétert szeretnénk visszaadni egy függvény visszatérési értékeként. Ezenkívül érdekességképp meg lehet említeni, hogy ez a struktúra lehetővé teszi pl. két változó értékének felcserélését is, ideiglenes változó bevezetése nélkül.
A NICE lehetőséget ad az opcionális metódusparaméterek kezelésére is, méghozzá az ADA nyelvben használatos módon, lehetővé téve, hogy a hívó oldal is név szerint specifikálhassa, mely paramétereket akarja átadni és milyen sorrendben. Ezen lehetőség nagyban megkönnyíti a munkát, hiszen nem kell rengeteg, csak a paraméterezésben különböző függvénytípust előállítanunk egy osztályban, ha meg akarjuk engedni az opcionális paraméterezést általános módon, és a kód olvashatóságát is nagy mértékben növeli.
A nyelv lehetőséget ad a modern programozáselméleti módszerek bizonyos eszközeinek használatára is, mint például az invariánsok ellenőrzésére („assertions”), illetve elő és utófeltételek megadásával („requires-ensures” kulcsszavak) funkcionális nyelvi elemekkel megadható függvényeket készíthetünk, ill. további futásidejű „őrfeltételeket” állíthatunk egyes metódusaink mellé.
A NICE nyelv jelenlegi implementációja teljesen integrálható a JAVA nyelvvel, ami azt jelenti, hogy egyrésztől felhasználhatjuk már meglévő JAVA csomagjainkat (beleértve az összes magasszintű GUI, IO és egyéb könyvtárakat), illetve a NICE-ban készült könyvtárak is felhasználhatóak JAVA programokban, és függvényszinten is tudjuk keverni a két nyelv hívásait. Következményképp a NICE programok is JAVA bytekódba fordulnak le és ezért minden olyan platformon használhatóak, ahol a JAVA virtuális gép rendelkezésre áll. A NICE fordító önmaga is futtatható JVM segítségével. (JVM 1.2-es minimális verzióval).
A NICE programozási nyelv megvalósítása GPL licensz alatt történt, a futásidejű könyvtárak pedig „GPL + linking exception” licensz alatt, amely lehetővé teszi, hogy a NICE alatt fordított programok tetszőleges módon licenszelhetőek legyenek. A NICE nyelv fejlesztésének főkoordinátora Daniel Bonniott, azonban fejlesztésében még sokan mások is részt vesznek. A NICE egy nyílt forráskodú projekt, fejlesztése mind a mai napig folyamatban van, minden vele kapcsolatos friss információ megtalálható a http://nice.sourceforge.net honlapon.