{"id":17184796,"url":"https://github.com/leodpen/betterbuilder","last_synced_at":"2025-04-13T18:14:14.745Z","repository":{"id":57716025,"uuid":"331688243","full_name":"LEODPEN/BetterBuilder","owner":"LEODPEN","description":" A Java annotation processor used for automatically generating better builder codes.","archived":false,"fork":false,"pushed_at":"2021-02-16T15:49:08.000Z","size":72,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-13T18:14:09.635Z","etag":null,"topics":["builder","java-annotation-processor","type-safe-builder"],"latest_commit_sha":null,"homepage":"https://search.maven.org/artifact/cn.mpy634/BetterBuilder/1.0.8/jar","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LEODPEN.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}},"created_at":"2021-01-21T16:35:34.000Z","updated_at":"2023-02-14T19:45:38.000Z","dependencies_parsed_at":"2022-09-26T21:31:35.301Z","dependency_job_id":null,"html_url":"https://github.com/LEODPEN/BetterBuilder","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LEODPEN%2FBetterBuilder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LEODPEN%2FBetterBuilder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LEODPEN%2FBetterBuilder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LEODPEN%2FBetterBuilder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LEODPEN","download_url":"https://codeload.github.com/LEODPEN/BetterBuilder/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248758418,"owners_count":21156957,"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":["builder","java-annotation-processor","type-safe-builder"],"created_at":"2024-10-15T00:44:25.827Z","updated_at":"2025-04-13T18:14:14.711Z","avatar_url":"https://github.com/LEODPEN.png","language":"Java","readme":"# BetterBuilder\n\n[![GitHub license](https://img.shields.io/github/license/LEODPEN/BetterBuilder)](https://github.com/LEODPEN/BetterBuilder/blob/main/LICENSE) \n![Build status](https://img.shields.io/badge/build-passing-brightgreen)\n[![Version](https://img.shields.io/badge/version-1.0.8-orange)](https://github.com/LEODPEN/BetterBuilder/releases)\n---\nBetterBuilder is a [Java annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) used for\nautomatically generating **better** builder codes([builder design pattern](https://en.wikipedia.org/wiki/Builder_pattern#Java)), \nwhich can make coding much more comfortable.\n\n### Why better ?\n\n+ [fluent get/set method](#fluentSet-switch)\n+ [configurable get/set](#field-ignore).\n+ [2 set types provided](#set-type)\n+ 3 builder patterns provided:\n    + [no builder](#nobuilder-switch)\n    + [classic](#usage)\n    + [**type safe**](#type-safe-builder)\n\n\n## Getting BetterBuilder\n\n\u003e BetterBuilder doesn't add any runtime dependencies to your codes.\n\n### Directly reach the jar\n\nDownload from [releases](https://github.com/LEODPEN/betterBuilder/releases).\n(Just add it to your classpath)\n### Maven\n\nBetterBuilder(v1.0.8) has already been published to Central https://repo1.maven.org/maven2/.\n\nExample Maven settings:\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecn.mpy634\u003c/groupId\u003e\n  \u003cartifactId\u003eBetterBuilder\u003c/artifactId\u003e\n  \u003cversion\u003e1.0.8\u003c/version\u003e\n  \u003cscope\u003eprovided\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n## Usage\n\n\u003e Simple example; [See how to customize](#customization)\n \nGiven a class \"Student\":\n\n```java\nimport cn.mpy634.annotation.BetterBuilder;\n// All configurations are default.\n@BetterBuilder\npublic class Student {\n    private String name;\n    private Integer ID;\n}\n```\nThe compiled code could be :\n```java\npublic class Student {\n    private String name;\n    private Integer ID;\n    public Student ID(Integer ID) {this.ID = ID;return this;}\n    public Integer ID() {return this.ID;}\n    public Student name(String name) {this.name = name;return this;}\n    public String name() {return this.name;}\n    public static Student.StudentBuilder builder() {return new Student.StudentBuilder();}\n    public Student(String name, Integer ID) {this.name = name;this.ID = ID;}\n    public Student() {}\n    public static class StudentBuilder {\n        private String name;\n        private Integer ID;\n        private StudentBuilder() {}\n        public Student.StudentBuilder name(String name) {this.name = name;return this;}\n        public Student.StudentBuilder ID(Integer ID) {this.ID = ID;return this;}\n        public Student build() {return new Student(this.name, this.ID);}\n    }\n}\n```\nTherefore you can code like \n\n`Student stu = Student.builder().ID(xx).name(xx)....build().ID(xx).name(xx)...` .\n\nYou can also customize BetterBuilder.\n \n## Customization\n\n### FluentSet switch\n\nOnce make `fluentSet = false`, BetterBuilder will not generate set methods.\n```java\n@BetterBuilder(fluentSet = false)\npublic class Student {\n    ...\n}\n```\n\n### FluentGet switch\n\nOnce make `fluentGet = false`, BetterBuilder will not generate get methods.\n```java\n@BetterBuilder(fluentGet = false)\npublic class Student {\n    ...\n}\n```\n\n### Set type\n\nMake `setType = 0 / 1` to change the return type of generated set methods.\n\nGiven a field `private Integer ID;`, 2 kinds of set methods are available.\n\nWhen `setType = 0`, which is default( strongly suggested ):\n```java\n@BetterBuilder(setType = 0)\npublic class Student {\n    private Integer ID;\n    public Student ID(Integer ID){this.ID = ID; return this;}\n}\n```\nwhen `setType = 1`, set methods will return nothing:\n```java\n@BetterBuilder(setType = 1)\npublic class Student {\n    private Integer ID;\n    public void ID(Integer ID){this.ID = ID;}\n}\n```\n\n### NoBuilder switch\n\nOnce make `BUILDER_TYPE = BuilderType.NO_BUILDER`, BetterBuilder will not generate builder methods (nor the allArgsConstructor).\n```java\n@BetterBuilder(BUILDER_TYPE = BuilderType.NO_BUILDER)\npublic class Student {\n    ...\n}\n```\n\n### Field ignore\n\nMake any fields annotated with **@IgnoreGet** or **@IgnoreSet**, BetterBuilder will\nnot generate the get or set methods for them.\n```java\n@BetterBuilder\npublic class Student {\n    @IgnoreSet\n    private String 牛;\n    @IgnoreGet\n    private Integer 年;\n    @IgnoreGet\n    @IgnoreSet\n    private Student 大;\n    private List\u003cBoolean\u003e 吉;\n}\n```\nIt is for those **fields that aren't allowed to be changed or accessed after \ninitialization**.\n\n### Type-Safe Builder\n\nWhen we use builder pattern to generate our object, some fields are supposed to be\ninitialized. But the classic pattern does not guarantee this.\n\nBetterBuilder provides a type-safe builder pattern. Once the fields annotated with\n@Required haven't been initialized, the goal object will not be generated ( Instead, an IllegalArgumentException will be thrown ).\n\n```java\n@BetterBuilder(BUILDER_TYPE = BuilderType.TYPE_SAFE, fluentSet = false, fluentGet = true)\npublic class TypeSafe {\n    @BetterBuilder.Required\n    private Integer ID;\n    @BetterBuilder.Required\n    private String name;\n    private Boolean PID;\n    private Long PID79211;\n}\n```\nYou can also see the detail files : \n[type-safe](https://github.com/LEODPEN/BetterBuilder/blob/main/testModule/src/main/java/TypeSafe.java) and  [type-safe-test](https://github.com/LEODPEN/BetterBuilder/blob/main/testModule/src/test/java/TypeSafeTest.java).\n\n## Todo list\n\n- [x] fluent - builder / test\n    - [x] noBuilder\n- [x] fluent - set / test\n    - [x] chain set options\n    - [x] ignore set\n- [x] fluent - get / test\n    - [x] ignore get\n- [x] compatible with lombok\n- [x] type-safe builder\n\n...\n\n## Others\n\n+ Any bugs or suggestions? Plz make PRs or [issues](https://github.com/LEODPEN/BetterBuilder/issues).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleodpen%2Fbetterbuilder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleodpen%2Fbetterbuilder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleodpen%2Fbetterbuilder/lists"}