Java implementation of Identifiers spec
Identifiers are self-describing strings of data that can be decoded into semantically-meaningful values. Identifiers can define basic data types, like numbers and bytes. They can also describe values like geolocations, date-times and uuids.
Try out an online version at identifiers.io
Maven Central coordinates:
<dependency>
<groupId>io.identifiers</groupId>
<artifactId>identifiers</artifactId>
<version>0.1.0</version>
</dependency>
Identifiers comes with a set of static factory methods to encode Identifier instances and decode these encoded strings.
import io.identifiers.Factory; import io.identifiers.Identifier; Identifier<String> stringId = Factory.forString.create("a string value"); String encodedDataId = stringId.toDataString(); // smaller, good for data storage and transmission String encodedHumanId = stringId.toHumanString(); // good for human interaction like emails and URLs Identifier<String> decodedStringId = Factory.decodeFromString(encodedDataId); // also decodes human strings decodedStringId = Factory.decodeFromString(encodedHumanId);
Factories are provided for the following identifier types:
- string
- boolean
- integer (32-bit signed ints)
- float (64-bit signed decimals)
- long (64-bit signed ints)
- bytes
- UUID (any version)
- Datetime (Java Instant type)
- Geo (decimal latitude / longitude)
All the factory methods come with List and Map factory methods to create typed structured identifiers.
import io.identifiers.Factory; import io.identifiers.Identifier; // For datetime IDs import java.time.Instant; // List identifiers are declared as generic Lists. ListIdentifier<Boolean> booleanListId = Factory.forString.createList(true, false); Map<String, Instant>> dates = new HashMap<>(); dates.put("before", Instant.parse("2010-01-01")); dates.put("after", Instant.parse("2011-12-31")); // Map identifiers are declared as generic Maps with String keys. MapIdentifier<Instant> Factory.forDatetime.createMap(dates);
Different types of identifiers can be combined into a composite identifier. They can be composed as either Lists or Maps.
import io.identifiers.Factory; import io.identifiers.Identifier; ListIdentifier<Identifier<?>> compositeListId = Factory.forComposite.createList( Factory.forString.create("s1"), Factory.forFloat.createList(22.1, 6543.87), Factory.forBoolean.createMap(java.util.Collections.singletonMap("flag", true)));