Using Lombok to Simplify the Code

The Problem
We use configuration-driven approach, that means we store a lot of configuration data in our database, so we can change the configuration at runtime.

To learn more about the feature service please check Building Troubleshooting Friendly Application - Using Feature Toggle.

We store the configuration data as json string in database,  please check Merge JSON Objects: Jackson + BeanUtils.copyProperties to learn how to use jackson and spring BeanUtils to merge two objects.

But one issue is that the class is getting bigger and bigger: it contains fields, their getter, setters, toString, hashCode, equals and extractXXX methods which returns Nonnull value - it read value from database, if not exists, either return coded default value or default value from from property file.

The Solution
Lombok comes to rescue. All we need is to add the @Data annotation, it will generate getter, setter, toString, hashCode, equals. This reduces lines of the class from 300+ to about 100.

Also we use SpringContextBridge to read default value from property file if the field isn't set in db.
@Data
public class SimpleConfig implements Serializable {
  private Boolean xxAsync;
  // more fields ...
  @JsonIgnore 
  //this will first read from db, if not set, read from property file, if still not set, return default hard-coded value
  public boolean extractXXAsync() {
      return MoreObjects.firstNonNull(xxAsyn,
              SpringContextBridge.getProperty("xx.xxAsync", true, Boolean.class));
  }
}

@Component
public class SpringContextBridge implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
        SpringContextBridge.applicationContext = applicationContext;
    }
    public static <T> T getBean(final Class<T> serviceType) {
        return applicationContext.getBean(serviceType);
    }
    public static <T> T getProperty(final String key, final T defaultValue, final Class<T> targetType) {
        return MoreObjects.firstNonNull(applicationContext.getEnvironment().getProperty(key, targetType), defaultValue);
    }
}
Configuration and Install
Add lombok into project's pom.xml. Then go to run java -jar .m2\repository\org\projectlombok\lombok\latest\lombok-latest.jar, install lombok to eclipse you are using. 
You may need run eclipse clean: eclipse4.5/Eclipse.app/Contents/MacOS/eclipse -clean

Lombok features
@Data
@Accessors(chain = true)
Make field readonly
@Setter(AccessLevel.NONE)
@EqualsAndHashCode(callSuper = true)
@Value
@Builder
@NonNull
@Synchronized
synchronized done right: Don't expose your locks.
@Log

@Cleanup

Post a Comment

Labels

Java (159) Lucene-Solr (112) Interview (61) All (58) J2SE (53) Algorithm (45) Soft Skills (38) Eclipse (33) Code Example (31) Linux (25) JavaScript (23) Spring (22) Windows (22) Web Development (20) Tools (19) Nutch2 (18) Bugs (17) Debug (16) Defects (14) Text Mining (14) J2EE (13) Network (13) Troubleshooting (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) Problem Solving (9) UIMA (9) html (9) Http Client (8) Maven (8) Security (8) bat (8) blogger (8) Big Data (7) Continuous Integration (7) Google (7) Guava (7) JSON (7) Shell (7) ANT (6) Coding Skills (6) Database (6) Lesson Learned (6) Programmer Skills (6) Scala (6) Tips (6) css (6) Algorithm Series (5) Cache (5) Dynamic Languages (5) IDE (5) System Design (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) How to Interview (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Python (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts