{"id":21131158,"url":"https://github.com/wnameless/apt-constant-generator","last_synced_at":"2025-06-12T22:05:28.695Z","repository":{"id":192181372,"uuid":"686227390","full_name":"wnameless/apt-constant-generator","owner":"wnameless","description":"Annotation Processing Tool for Java Constant generating","archived":false,"fork":false,"pushed_at":"2023-09-02T06:50:48.000Z","size":28,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-12T22:05:26.574Z","etag":null,"topics":["java","java-annotation-processing","java-annotation-processor"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wnameless.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-09-02T05:07:07.000Z","updated_at":"2023-09-03T11:46:13.000Z","dependencies_parsed_at":"2023-09-03T07:09:39.771Z","dependency_job_id":null,"html_url":"https://github.com/wnameless/apt-constant-generator","commit_stats":null,"previous_names":["wnameless/apt-constant-generator"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wnameless/apt-constant-generator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fapt-constant-generator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fapt-constant-generator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fapt-constant-generator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fapt-constant-generator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wnameless","download_url":"https://codeload.github.com/wnameless/apt-constant-generator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wnameless%2Fapt-constant-generator/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259539116,"owners_count":22873340,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","java-annotation-processing","java-annotation-processor"],"created_at":"2024-11-20T05:49:54.180Z","updated_at":"2025-06-12T22:05:28.647Z","avatar_url":"https://github.com/wnameless.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.wnameless.apt/apt-constant-generator/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.wnameless.apt/apt-constant-generator)\n\napt-constant-generator\n=============\nAnnotation Processing Tool for Java Constant generating.\n\n## `Goal` - generating classes of Constants based on Java class names\nJava Constants(public static final) are widely used during development, however they are lack of flexibility. This apt-constant-generator provides a workaround toward this common issue.\n\n## `Purpose` - easier refactoring and maintenance by utilizing Java Constants\nFor example, Java annotation only accepts Constant or literal for String. Even though the annotation value may relate to class name somehow, we can't assign Class#getSimpleName or Class#getName to an annotation String attribute which makes refactoring and maintenance difficult sometimes.\n\n## `Furthermore` - optional Constants by annotation driven configuration\nConstants such as String, primitive, Class and Enum can also be generated by annotation driven configuration and stored in the same generated class.\n\n# Maven Repo\n```xml\n\u003cdependency\u003e\n\t\u003cgroupId\u003ecom.github.wnameless.apt\u003c/groupId\u003e\n\t\u003cartifactId\u003eapt-constant-generator\u003c/artifactId\u003e\n\t\u003cversion\u003e${newestVersion}\u003c/version\u003e\n\t\u003c!-- Newest version shows in the maven-central badge above --\u003e\n\u003c/dependency\u003e\n```\n\n# DEMO\nTraditional approach:\n```java\n@RequestMapping(\"/bars\")\n@Controller\npublic class BarController {}\n// Spring Controller for Bar entity\n```\n\nSolution brought by apt-constant-generator:\n```java\n// NRBar is a class of constants, which is automatically generated by spring-boot-up-apt\n@RequestMapping(NRBar.RESOURCE_PATH)\n@Controller\npublic class BarController {}\n```\n```java\n@NamedResource\npublic class Bar {}\n```\n\n# Quick Start\nAnnotate `@NamedResource` with any class, enum or interface\n```java\n@NamedResource\npublic class Bar {}\n```\n\nMaven dependencies\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.github.wnameless.apt\u003c/groupId\u003e\n  \u003cartifactId\u003eapt-constant-generator\u003c/artifactId\u003e\n  \u003cversion\u003e${newestVersion}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nMaven plugins\n```xml\n\u003cplugin\u003e\n  \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\n  \u003cartifactId\u003emaven-compiler-plugin\u003c/artifactId\u003e\n  \u003cconfiguration\u003e\n    \u003cannotationProcessorPaths\u003e\n      \u003cpath\u003e\n        \u003cgroupId\u003ecom.github.wnameless.apt\u003c/groupId\u003e\n        \u003cartifactId\u003eapt-constant-generator\u003c/artifactId\u003e\n        \u003cversion\u003e${newestVersion}\u003c/version\u003e\n      \u003c/path\u003e\n    \u003c/annotationProcessorPaths\u003e\n  \u003c/configuration\u003e\n\u003c/plugin\u003e\n```\n\n# Feature List\u003ca id='top'\u003e\u003c/a\u003e\n| Name | option | Description | Since |\n| --- | --- | --- | --- |\n| [NamedResource](#1.0.0-1) || Generate a class of constants based on the annotated class name | v1.0.0 |\n|| [default](#1.0.0-1.1) | Default behavior of @NamedResource | v1.0.0 |\n|| [injectable](#1.0.0-1.2) | Add jakarta.inject.Named or javax.inject.Named to the generated class | v1.0.0 |\n|| [markerInterface](#1.0.0-1.3) | Option to implement marker interface INamedResource for the generated class | v1.0.0 |\n|| [classNamePrefix\u003cbr\u003eclassNameSuffix](#1.0.0-1.4) | Add prefix or suffix to the generated class name | v1.0.0 |\n|| [singular](#1.0.0-1.5) | Change singular name for the annotated class  | v1.0.0 |\n|| [plural](#1.0.0-1.6) | Change plural name for the annotated class | v1.0.0 |\n|| [inferredConstants](#1.0.0-1.7) | Infer other String constants by given naming formats | v1.0.0 |\n|| [literalSingularConstants](#1.0.0-1.8) | Create constants of literal singular names in different naming formats | v1.0.0 |\n|| [literalPluralConstants](#1.0.0-1.9) | Create constants of literal plural names in different naming formats | v1.0.0 |\n|| [constants](#1.0.0-1.10) | Add optional String constants | v1.0.0 |\n|| [primitiveConstants](#1.0.0-1.11) | Add optional primitive constants | v1.0.0 |\n|| [classConstants](#1.0.0-1.12) | Add optional Class constants | v1.0.0 |\n|| [enumConstants](#1.0.0-1.13) | Add optional Enum constants | v1.0.0 |\n\n### [:top:](#top) NamedResource\u003ca id='1.0.0-1'\u003e\u003c/a\u003e\n#### [:top:](#top) Annotation option: `default`\u003ca id='1.0.0-1.1'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource\npublic SimpleNamedResource {}\n```\n_Generated_: NRSimpleNamedResource (NR is the default class name prefix)\n```java\nNRSimpleNamedResource.SINGULAR // SimpleNamedResource\nNRSimpleNamedResource.PLURAL   // SimpleNamedResources\n\nNRSimpleNamedResource.CLASS_SIMPLE_NAME // SimpleNamedResource\nNRSimpleNamedResource.CLASS_NAME        // model.SimpleNamedResource\nNRSimpleNamedResource.PACKAGE_NAME      // model\n\n// 5 naming formats: UPPER_CAMEL, LOWER_CAMEL, UPPER_UNDERSCORE, LOWER_UNDERSCORE, LOWER_HYPHEN\nNRSimpleNamedResource.UPPER_CAMEL_SINGULAR      // SimpleNamedResource\nNRSimpleNamedResource.LOWER_CAMEL_SINGULAR      // simpleNamedResource\nNRSimpleNamedResource.UPPER_UNDERSCORE_SINGULAR // SIMPLE_NAMED_RESOURCE\nNRSimpleNamedResource.LOWER_UNDERSCORE_SINGULAR // simple_named_resource\nNRSimpleNamedResource.LOWER_HYPHEN_SINGULAR     // simple-named-resource\nNRSimpleNamedResource.UPPER_CAMEL_PLURAL        // SimpleNamedResources\nNRSimpleNamedResource.LOWER_CAMEL_PLURAL        // simpleNamedResources\nNRSimpleNamedResource.UPPER_UNDERSCORE_PLURAL   // SIMPLE_NAMED_RESOURCES\nNRSimpleNamedResource.LOWER_UNDERSCORE_PLURAL   // simple_named_resources\nNRSimpleNamedResource.LOWER_HYPHEN_PLURAL       // simple-named-resources\n\n// Default inferred constants: RESOURCE, RESOURCES, RESOURCE_PATH\nNRSimpleNamedResource.RESOURCE      // simple-named-resource\nNRSimpleNamedResource.RESOURCES     // simple-named-resources\nNRSimpleNamedResource.RESOURCE_PATH // /simple-named-resources\n```\n\n#### [:top:](#top) Annotation option: `injectable`\u003ca id='1.0.0-1.2'\u003e\u003c/a\u003e\n_Config_:\n```java\n// Default value is InjectType.NONE\n@NamedResource(injectable = InjectType.JAKARTA) // InjectType.JAVAX is available\npublic class JakartaNamedResource {}\n```\n_Generated_:\n```java\n@Named // jakarta.inject.Named\npublic final class NRJakartaNamedResource implements INamedResource {\n  ...\n}\n```\n\n#### [:top:](#top) Annotation option: `markerInterface`\u003ca id='1.0.0-1.3'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(markerInterface = false) // Default value is true\npublic class NoMarkerNamedResource {}\n```\n_Generated_:\n```java\npublic final class NRJakartaNamedResource { // By default, all generated classes implement INamedResource marker interface\n  ...\n}\n```\n\n#### [:top:](#top) Annotation option: `classNamePrefix` and `classNameSuffix`\u003ca id='1.0.0-1.4'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(classNamePrefix = \"A\", classNameSuffix = \"Z\")\npublic class PrefixSuffixNamedResource {}\n```\n_Generated_:\n```java\npublic final class APrefixSuffixNamedResourceZ implements INamedResource {\n  ...\n}\n```\n\n#### [:top:](#top) Annotation option: `singular`\u003ca id='1.0.0-1.5'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(singular = @Naming(value = \"alt-sing-name-rsc\", format = NamingFormat.LOWER_HYPHEN))\npublic class AlteredSingularNamedResource {}\n```\n_Generated_:\n```java\n// JUnit\nassertEquals(\"alt-sing-name-rsc\", NRAlteredSingularNamedResource.SINGULAR);\n// singular opt affects plural opt,\n// however plural opt can be overridden if both singular and plural opts are existed\nassertEquals(\"alt-sing-name-rscs\", NRAlteredSingularNamedResource.PLURAL);\n```\n\n#### [:top:](#top) Annotation option: `plural`\u003ca id='1.0.0-1.6'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(plural = @Naming(value = \"alt-pl-name-rscs\", format = NamingFormat.LOWER_HYPHEN))\npublic class AlteredPluralOnlyNamedResource {}\n```\n_Generated_:\n```java\n// JUnit\n// plural opt won't affect singlur opt\nassertEquals(\"AlteredPluralOnlyNamedResource\", NRAlteredPluralOnlyNamedResource.SINGULAR);\nassertEquals(\"alt-pl-name-rscs\", NRAlteredPluralOnlyNamedResource.PLURAL);\n```\n\n#### [:top:](#top) Annotation option: `inferredConstants`\u003ca id='1.0.0-1.7'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(inferredConstants = {\n    @InferredConstant(name = \"ROOT\", plural = true,\n        format = NamingFormat.UPPER_CAMEL, prefix = \"/\"),\n    @InferredConstant(name = \"LIST_ITEM_TEMPLATE\", plural = false,\n        format = NamingFormat.LOWER_UNDERSCORE, suffix = \"_{}\")})\npublic class InferredConstantsNamedResource {}\n```\n_Generated_:\n```java\n// JUnit\nassertEquals(\"/InferredConstantsNamedResources\", NRInferredConstantsNamedResource.ROOT);\nassertEquals(\"inferred_constants_named_resource_{}\", NRInferredConstantsNamedResource.LIST_ITEM_TEMPLATE);\n```\n\n#### [:top:](#top) Annotation option: `literalSingularConstants`\u003ca id='1.0.0-1.8'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(singular = @Naming(value = \"MountEverest\", format = NamingFormat.UPPER_CAMEL),\n    literalSingularConstants = {\n        NamingFormat.LOWER_CAMEL, NamingFormat.UPPER_CAMEL,\n        NamingFormat.LOWER_UNDERSCORE, NamingFormat.UPPER_UNDERSCORE\n    })\n```\n_Generated_:\n```java\n// JUnit\nassertEquals(\"mountEverest\", NRLiteralSingularNamedResource.mountEverest);\nassertEquals(\"mount_everest\", NRLiteralSingularNamedResource.mount_everest);\nassertEquals(\"MountEverest\", NRLiteralSingularNamedResource.MountEverest);\nassertEquals(\"MOUNT_EVEREST\", NRLiteralSingularNamedResource.MOUNT_EVEREST);\n```\n\n#### [:top:](#top) Annotation option: `literalPluralConstants`\u003ca id='1.0.0-1.9'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(plural = @Naming(value = \"bellBottoms\", format = NamingFormat.LOWER_CAMEL),\n    literalPluralConstants = {\n        NamingFormat.LOWER_CAMEL, NamingFormat.UPPER_CAMEL,\n        NamingFormat.LOWER_UNDERSCORE, NamingFormat.UPPER_UNDERSCORE\n    })\n```\n_Generated_:\n```java\n// JUnit\nassertEquals(\"bellBottoms\", NRLiteralPluralNamedResource.bellBottoms);\nassertEquals(\"BellBottoms\", NRLiteralPluralNamedResource.BellBottoms);\nassertEquals(\"bell_bottoms\", NRLiteralPluralNamedResource.bell_bottoms);\nassertEquals(\"BELL_BOTTOMS\", NRLiteralPluralNamedResource.BELL_BOTTOMS);\n```\n\n#### [:top:](#top) Annotation option: `constants`\u003ca id='1.0.0-1.10'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(constants = {\n    @Constant(name = \"DEATH_CARD\", value = \"Spade-1\"),\n    @Constant(name = \"BEER_CARD\", value = \"Diamond-7\")})\npublic class ConstantNamedResource {}\n```\n_Generated_:\n```java\n// JUnit\nassertEquals(\"Spade-1\", NRConstantNamedResource.DEATH_CARD);\nassertEquals(\"Diamond-7\", NRConstantNamedResource.BEER_CARD);\n```\n\n#### [:top:](#top) Annotation option: `primitive constants`\u003ca id='1.0.0-1.11'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(\n    booleanConstants = {@BooleanConstant(name = \"LIE\", value = false)},\n    byteConstants = {@ByteConstant(name = \"BITS\", value = 8)},\n    charConstants = {@CharConstant(name = \"YES\", value = 'y')},\n    shortConstants = {@ShortConstant(name = \"UNIX_EPOCH_YEAR\", value = 1970)},\n    intConstants = {@IntConstant(name = \"MARS_DISTANCE_KM\", value = 225000000)},\n    longConstants = {@LongConstant(name = \"LIGHT_YEAR_M\", value = 9460730777119564L)},\n    floatConstants = {@FloatConstant(name = \"GOLDEN_RATIO\", value = 1.618f)},\n    doubleConstants = {@DoubleConstant(name = \"PI\", value = 3.14159265358979323846)}\n)\npublic class ConstantsNamedResource {}\n```\n_Generated_:\n```java\n// JUnit\nassertEquals(false, NRConstantsNamedResource.LIE);\nassertEquals(8, NRConstantsNamedResource.BITS);\nassertEquals('y', NRConstantsNamedResource.YES);\nassertEquals(1970, NRConstantsNamedResource.UNIX_EPOCH_YEAR);\nassertEquals(225000000, NRConstantsNamedResource.MARS_DISTANCE_KM);\nassertEquals(9460730777119564L, NRConstantsNamedResource.LIGHT_YEAR_M);\nassertEquals(1.618f, NRConstantsNamedResource.GOLDEN_RATIO);\nassertEquals(3.14159265358979323846, NRConstantsNamedResource.PI);\n```\n\n#### [:top:](#top) Annotation option: `classConstants`\u003ca id='1.0.0-1.12'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(\n    classConstants = {@ClassConstant(name = \"INTEGER_CLASS\", value = Integer.class)}\n)\npublic class ConstantsNamedResource {}\n```\n_Generated_:\n```java\n// JUnit\nassertEquals(Integer.class, NRConstantsNamedResource.INTEGER_CLASS);\n```\n\n#### [:top:](#top) Annotation option: `enumConstants`\u003ca id='1.0.0-1.13'\u003e\u003c/a\u003e\n_Config_:\n```java\n@NamedResource(\n    enumConstants = {\n        @EnumConstant(name = \"MONTH_SEPTEMBER\", valueType = Month.class, valueKey = \"SEPTEMBER\")}\n)\npublic class ConstantsNamedResource {}\n```\n_Generated_:\n```java\n// JUnit\nassertEquals(Month.SEPTEMBER, NRConstantsNamedResource.MONTH_SEPTEMBER);\n```\n_Advanced Usage_:\n```java\n// Lombok(@FieldNameConstants) - generates String constants for all Enum constant names\n@FieldNameConstants\npublic enum RBG {\n  @FieldNameConstants.Include RED,\n  @FieldNameConstants.Include BLUE,\n  @FieldNameConstants.Include GREEN;\n}\n```\n```java\n// To avoid refactoring errors in the future by using RBG.Fields.BLUE as the valueKey\n@NamedResource(\n    enumConstants = {\n        @EnumConstant(name = \"RGB_BLUE\", valueType = RBG.class, valueKey = RBG.Fields.BLUE)}\n)\npublic class ConstantsNamedResource {}\n```\n\n## MISC\n| Note| Since |\n| --- | --- |\n| Java 17 required. | v1.0.0 |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwnameless%2Fapt-constant-generator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwnameless%2Fapt-constant-generator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwnameless%2Fapt-constant-generator/lists"}