diff --git a/tools/aconfig/src/codegen_java.rs b/tools/aconfig/src/codegen_java.rs
index 15eb2d6..79c6eb4 100644
--- a/tools/aconfig/src/codegen_java.rs
+++ b/tools/aconfig/src/codegen_java.rs
@@ -233,8 +233,8 @@
         let expected_featureflagsimpl_content = r#"
         package com.android.aconfig.test;
         import static java.util.stream.Collectors.toMap;
-        import java.util.stream.Stream;
         import java.util.HashMap;
+        import java.util.stream.Stream;
         public final class FeatureFlagsImpl implements FeatureFlags {
             @Override
             public boolean disabledRo() {
diff --git a/tools/aconfig/templates/FeatureFlags.java.template b/tools/aconfig/templates/FeatureFlags.java.template
index b9e2cc7..e0f201f 100644
--- a/tools/aconfig/templates/FeatureFlags.java.template
+++ b/tools/aconfig/templates/FeatureFlags.java.template
@@ -1,7 +1,7 @@
 package {package_name};
 
 public interface FeatureFlags \{
-    {{ for item in class_elements}}
+{{ for item in class_elements}}
     boolean {item.method_name}();
-    {{ endfor }}
-}
\ No newline at end of file
+{{ endfor }}
+}
diff --git a/tools/aconfig/templates/FeatureFlagsImpl.java.template b/tools/aconfig/templates/FeatureFlagsImpl.java.template
index dafd99e..f5edd1b 100644
--- a/tools/aconfig/templates/FeatureFlagsImpl.java.template
+++ b/tools/aconfig/templates/FeatureFlagsImpl.java.template
@@ -2,15 +2,15 @@
 {{ -if is_test_mode }}
 import static java.util.stream.Collectors.toMap;
 
-import java.util.stream.Stream;
 import java.util.HashMap;
+import java.util.stream.Stream;
 {{ else}}
 {{ if is_read_write- }}
 import android.provider.DeviceConfig;
 {{ -endif- }}
 {{ endif }}
 public final class FeatureFlagsImpl implements FeatureFlags \{
-    {{ for item in class_elements}}
+{{ for item in class_elements}}
     @Override
     public boolean {item.method_name}() \{
         {{ -if not is_test_mode- }}
@@ -20,16 +20,15 @@
             "{item.device_config_flag}",
             {item.default_value}
         );
-        {{ else }}
+        {{ -else }}
         return {item.default_value};
         {{ -endif- }}
         {{ else }}
         return getFlag(Flags.FLAG_{item.flag_name_constant_suffix});
         {{ -endif }}
     }
-    {{ endfor }}
-
-    {{ if is_test_mode- }}
+{{ endfor- }}
+{{ if is_test_mode }}
     public void setFlag(String flagName, boolean value) \{
         if (!this.mFlagMap.containsKey(flagName)) \{
             throw new IllegalArgumentException("no such flag" + flagName);
@@ -55,7 +54,5 @@
             (map, elem) -> map.put(elem, null),
             HashMap::putAll
         );
-    {{ -endif }}
+{{ -endif }}
 }
-
-
diff --git a/tools/aconfig/templates/Flags.java.template b/tools/aconfig/templates/Flags.java.template
index eef98eb..c244b15 100644
--- a/tools/aconfig/templates/Flags.java.template
+++ b/tools/aconfig/templates/Flags.java.template
@@ -1,15 +1,15 @@
 package {package_name};
 
 public final class Flags \{
-    {{- for item in class_elements}}
+{{- for item in class_elements}}
     public static final String FLAG_{item.flag_name_constant_suffix} = "{item.device_config_flag}";
-    {{- endfor }}
-    {{ for item in class_elements}}
+{{- endfor }}
+{{ for item in class_elements}}
     public static boolean {item.method_name}() \{
         return FEATURE_FLAGS.{item.method_name}();
     }
-    {{ endfor }}
-    {{ if is_test_mode }}
+{{ endfor }}
+{{ -if is_test_mode }}
     public static void setFeatureFlagsImpl(FeatureFlags featureFlags) \{
         Flags.FEATURE_FLAGS = featureFlags;
     }
@@ -17,8 +17,7 @@
     public static void unsetFeatureFlagsImpl() \{
         Flags.FEATURE_FLAGS = null;
     }
-    {{ -endif}}
-
+{{ endif}}
     private static FeatureFlags FEATURE_FLAGS{{ -if not is_test_mode }} = new FeatureFlagsImpl(){{ -endif- }};
 
 }
