diff --git a/src/main/java/org/apache/commons/text/lookup/JavaPlatformStringLookup.java b/src/main/java/org/apache/commons/text/lookup/JavaPlatformStringLookup.java
index ee7f556..4155a24 100644
--- a/src/main/java/org/apache/commons/text/lookup/JavaPlatformStringLookup.java
+++ b/src/main/java/org/apache/commons/text/lookup/JavaPlatformStringLookup.java
@@ -1,147 +1,186 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
-package org.apache.commons.text.lookup;
-
-import java.util.Locale;
-
-import org.apache.commons.lang3.StringUtils;
-
-/**
- * Looks up keys related to Java: Java version, JRE version, VM version, and so on.
- *
- * @since 1.3
- */
-final class JavaPlatformStringLookup extends AbstractStringLookup {
-
-    /**
-     * Defines the singleton for this class.
-     */
-    static final JavaPlatformStringLookup INSTANCE = new JavaPlatformStringLookup();
-
-    /**
-     * No need to build instances for now.
-     */
-    private JavaPlatformStringLookup() {
-        // empty
-    }
-
-    /**
-     * Accessible through the Lookup key {@code hardware}.
-     *
-     * @return hardware processor information.
-     */
-    String getHardware() {
-        return "processors: " + Runtime.getRuntime().availableProcessors() + ", architecture: "
-                + getSystemProperty("os.arch") + this.getSystemProperty("-", "sun.arch.data.model")
-                + this.getSystemProperty(", instruction sets: ", "sun.cpu.isalist");
-    }
-
-    /**
-     * Accessible through the Lookup key {@code locale}.
-     *
-     * @return system locale and file encoding information.
-     */
-    String getLocale() {
-        return "default locale: " + Locale.getDefault() + ", platform encoding: " + getSystemProperty("file.encoding");
-    }
-
-    /**
-     * Accessible through the Lookup key {@code os}.
-     *
-     * @return operating system information.
-     */
-    String getOperatingSystem() {
-        return getSystemProperty("os.name") + " " + getSystemProperty("os.version")
-                + getSystemProperty(" ", "sun.os.patch.level") + ", architecture: " + getSystemProperty("os.arch")
-                + getSystemProperty("-", "sun.arch.data.model");
-    }
-
-    /**
-     * Accessible through the Lookup key {@code runtime}.
-     *
-     * @return Java Runtime Environment information.
-     */
-    String getRuntime() {
-        return getSystemProperty("java.runtime.name") + " (build " + getSystemProperty("java.runtime.version")
-                + ") from " + getSystemProperty("java.vendor");
-    }
-
-    /**
-     * Gets the given system property.
-     *
-     * @param name
-     *            a system property name.
-     * @return a system property value.
-     */
-    private String getSystemProperty(final String name) {
-        return SystemPropertyStringLookup.INSTANCE.lookup(name);
-    }
-
-    /**
-     * Gets the given system property.
-     *
-     * @param prefix
-     *            the prefix to use for the result string
-     * @param name
-     *            a system property name.
-     * @return the prefix + a system property value.
-     */
-    private String getSystemProperty(final String prefix, final String name) {
-        final String value = getSystemProperty(name);
-        if (StringUtils.isEmpty(value)) {
-            return StringUtils.EMPTY;
-        }
-        return prefix + value;
-    }
-
-    /**
-     * Accessible through the Lookup key {@code vm}.
-     *
-     * @return Java Virtual Machine information.
-     */
-    String getVirtualMachine() {
-        return getSystemProperty("java.vm.name") + " (build " + getSystemProperty("java.vm.version") + ", "
-                + getSystemProperty("java.vm.info") + ")";
-    }
-
-    /**
-     * Looks up the value of the Java platform key.
-     *
-     * @param key
-     *            the key to be looked up, may be null
-     * @return The value of the environment variable.
-     */
-    @Override
-    public String lookup(final String key) {
-        switch (key) {
-        case "version":
-            return "Java version " + getSystemProperty("java.version");
-        case "runtime":
-            return getRuntime();
-        case "vm":
-            return getVirtualMachine();
-        case "os":
-            return getOperatingSystem();
-        case "hardware":
-            return getHardware();
-        case "locale":
-            return getLocale();
-        default:
-            throw new IllegalArgumentException(key);
-        }
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.commons.text.lookup;
+
+import java.util.Locale;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * Looks up keys related to Java: Java version, JRE version, VM version, and so on.
+ * <p>
+ * The lookup keys with examples are:
+ * </p>
+ * <ul>
+ * <li><b>version</b>: "Java version 1.8.0_181"</li>
+ * <li><b>runtime</b>: "Java(TM) SE Runtime Environment (build 1.8.0_181-b13) from Oracle Corporation"</li>
+ * <li><b>vm</b>: "Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)"</li>
+ * <li><b>os</b>: "Windows 10 10.0, architecture: amd64-64"</li>
+ * <li><b>hardware</b>: "processors: 4, architecture: amd64-64, instruction sets: amd64"</li>
+ * <li><b>locale</b>: "default locale: en_US, platform encoding: iso-8859-1"</li>
+ * </ul>
+ * 
+ * @since 1.3
+ */
+final class JavaPlatformStringLookup extends AbstractStringLookup {
+
+    private static final String KEY_LOCALE = "locale";
+    private static final String KEY_HARDWARE = "hardware";
+    private static final String KEY_OS = "os";
+    private static final String KEY_VM = "vm";
+    private static final String KEY_RUNTIME = "runtime";
+    private static final String KEY_VERSION = "version";
+
+    /**
+     * Defines the singleton for this class.
+     */
+    static final JavaPlatformStringLookup INSTANCE = new JavaPlatformStringLookup();
+
+    public static void main(String[] args) {
+        System.out.println(JavaPlatformStringLookup.class);
+        System.out.printf("%s = %s\n", KEY_VERSION, JavaPlatformStringLookup.INSTANCE.lookup(KEY_VERSION));
+        System.out.printf("%s = %s\n", KEY_RUNTIME, JavaPlatformStringLookup.INSTANCE.lookup(KEY_RUNTIME));
+        System.out.printf("%s = %s\n", KEY_VM, JavaPlatformStringLookup.INSTANCE.lookup(KEY_VM));
+        System.out.printf("%s = %s\n", KEY_OS, JavaPlatformStringLookup.INSTANCE.lookup(KEY_OS));
+        System.out.printf("%s = %s\n", KEY_HARDWARE, JavaPlatformStringLookup.INSTANCE.lookup(KEY_HARDWARE));
+        System.out.printf("%s = %s\n", KEY_LOCALE, JavaPlatformStringLookup.INSTANCE.lookup(KEY_LOCALE));
+    }
+
+    /**
+     * No need to build instances for now.
+     */
+    private JavaPlatformStringLookup() {
+        // empty
+    }
+
+    /**
+     * Accessible through the Lookup key {@code hardware}.
+     *
+     * @return hardware processor information.
+     */
+    String getHardware() {
+        return "processors: " + Runtime.getRuntime().availableProcessors() + ", architecture: "
+                + getSystemProperty("os.arch") + this.getSystemProperty("-", "sun.arch.data.model")
+                + this.getSystemProperty(", instruction sets: ", "sun.cpu.isalist");
+    }
+
+    /**
+     * Accessible through the Lookup key {@code locale}.
+     *
+     * @return system locale and file encoding information.
+     */
+    String getLocale() {
+        return "default locale: " + Locale.getDefault() + ", platform encoding: " + getSystemProperty("file.encoding");
+    }
+
+    /**
+     * Accessible through the Lookup key {@code os}.
+     *
+     * @return operating system information.
+     */
+    String getOperatingSystem() {
+        return getSystemProperty("os.name") + " " + getSystemProperty("os.version")
+                + getSystemProperty(" ", "sun.os.patch.level") + ", architecture: " + getSystemProperty("os.arch")
+                + getSystemProperty("-", "sun.arch.data.model");
+    }
+
+    /**
+     * Accessible through the Lookup key {@code runtime}.
+     *
+     * @return Java Runtime Environment information.
+     */
+    String getRuntime() {
+        return getSystemProperty("java.runtime.name") + " (build " + getSystemProperty("java.runtime.version")
+                + ") from " + getSystemProperty("java.vendor");
+    }
+
+    /**
+     * Gets the given system property.
+     *
+     * @param name
+     *            a system property name.
+     * @return a system property value.
+     */
+    private String getSystemProperty(final String name) {
+        return SystemPropertyStringLookup.INSTANCE.lookup(name);
+    }
+
+    /**
+     * Gets the given system property.
+     *
+     * @param prefix
+     *            the prefix to use for the result string
+     * @param name
+     *            a system property name.
+     * @return the prefix + a system property value.
+     */
+    private String getSystemProperty(final String prefix, final String name) {
+        final String value = getSystemProperty(name);
+        if (StringUtils.isEmpty(value)) {
+            return StringUtils.EMPTY;
+        }
+        return prefix + value;
+    }
+
+    /**
+     * Accessible through the Lookup key {@code vm}.
+     *
+     * @return Java Virtual Machine information.
+     */
+    String getVirtualMachine() {
+        return getSystemProperty("java.vm.name") + " (build " + getSystemProperty("java.vm.version") + ", "
+                + getSystemProperty("java.vm.info") + ")";
+    }
+
+    /**
+     * Looks up the value of the Java platform key.
+     * <p>
+     * The lookup keys with examples are:
+     * </p>
+     * <ul>
+     * <li><b>version</b>: "Java version 1.8.0_181"</li>
+     * <li><b>runtime</b>: "Java(TM) SE Runtime Environment (build 1.8.0_181-b13) from Oracle Corporation"</li>
+     * <li><b>vm</b>: "Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)"</li>
+     * <li><b>os</b>: "Windows 10 10.0, architecture: amd64-64"</li>
+     * <li><b>hardware</b>: "processors: 4, architecture: amd64-64, instruction sets: amd64"</li>
+     * <li><b>locale</b>: "default locale: en_US, platform encoding: iso-8859-1"</li>
+     * </ul>
+     *
+     * @param key
+     *            the key to be looked up, may be null
+     * @return The value of the environment variable.
+     */
+    @Override
+    public String lookup(final String key) {
+        switch (key) {
+        case KEY_VERSION:
+            return "Java version " + getSystemProperty("java.version");
+        case KEY_RUNTIME:
+            return getRuntime();
+        case KEY_VM:
+            return getVirtualMachine();
+        case KEY_OS:
+            return getOperatingSystem();
+        case KEY_HARDWARE:
+            return getHardware();
+        case KEY_LOCALE:
+            return getLocale();
+        default:
+            throw new IllegalArgumentException(key);
+        }
+    }
+}
diff --git a/src/main/java/org/apache/commons/text/lookup/StringLookupFactory.java b/src/main/java/org/apache/commons/text/lookup/StringLookupFactory.java
index 73c3153..86221e6 100644
--- a/src/main/java/org/apache/commons/text/lookup/StringLookupFactory.java
+++ b/src/main/java/org/apache/commons/text/lookup/StringLookupFactory.java
@@ -39,7 +39,7 @@
     public static void clear() {
         ConstantStringLookup.clear();
     }
-    
+
     /**
      * No need to build instances for now.
      */
@@ -154,7 +154,8 @@
      * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li>
      * <li>"java" for the {@link JavaPlatformStringLookup}.</li>
      * <li>"date" for the {@link DateStringLookup}.</li>
-     * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names; since 1.3.</li>
+     * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names; since
+     * 1.3.</li>
      * <li>"xml" for the {@link XmlStringLookup} since 1.5.</li>
      * <li>"properties" for the {@link PropertiesStringLookup} since 1.5.</li>
      * <li>"script" for the {@link ScriptStringLookup} since 1.5.</li>
@@ -183,7 +184,8 @@
      * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li>
      * <li>"java" for the {@link JavaPlatformStringLookup}.</li>
      * <li>"date" for the {@link DateStringLookup}.</li>
-     * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names; since 1.3.</li>
+     * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names; since
+     * 1.3.</li>
      * <li>"xml" for the {@link XmlStringLookup} since 1.5.</li>
      * <li>"properties" for the {@link PropertiesStringLookup} since 1.5.</li>
      * <li>"script" for the {@link ScriptStringLookup} since 1.5.</li>
@@ -219,7 +221,8 @@
      * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li>
      * <li>"java" for the {@link JavaPlatformStringLookup}.</li>
      * <li>"date" for the {@link DateStringLookup}.</li>
-     * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names; since 1.3.</li>
+     * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names; since
+     * 1.3.</li>
      * <li>"xml" for the {@link XmlStringLookup} since 1.5.</li>
      * <li>"properties" for the {@link PropertiesStringLookup} since 1.5.</li>
      * <li>"script" for the {@link ScriptStringLookup} since 1.5.</li>
@@ -251,7 +254,8 @@
      * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li>
      * <li>"java" for the {@link JavaPlatformStringLookup}.</li>
      * <li>"date" for the {@link DateStringLookup}.</li>
-     * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names; since 1.3.</li>
+     * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names; since
+     * 1.3.</li>
      * <li>"xml" for the {@link XmlStringLookup} since 1.5.</li>
      * <li>"properties" for the {@link PropertiesStringLookup} since 1.5.</li>
      * <li>"script" for the {@link ScriptStringLookup} since 1.5.</li>
@@ -272,8 +276,20 @@
     }
 
     /**
-     * Returns the JavaPlatformStringLookup singleton instance.
-     *
+     * Returns the JavaPlatformStringLookup singleton instance. Looks up keys related to Java: Java version, JRE
+     * version, VM version, and so on.
+     * <p>
+     * The lookup keys with examples are:
+     * </p>
+     * <ul>
+     * <li><b>version</b>: "Java version 1.8.0_181"</li>
+     * <li><b>runtime</b>: "Java(TM) SE Runtime Environment (build 1.8.0_181-b13) from Oracle Corporation"</li>
+     * <li><b>vm</b>: "Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)"</li>
+     * <li><b>os</b>: "Windows 10 10.0, architecture: amd64-64"</li>
+     * <li><b>hardware</b>: "processors: 4, architecture: amd64-64, instruction sets: amd64"</li>
+     * <li><b>locale</b>: "default locale: en_US, platform encoding: iso-8859-1"</li>
+     * </ul>
+     * 
      * @return the JavaPlatformStringLookup singleton instance.
      */
     public StringLookup javaPlatformStringLookup() {
@@ -355,7 +371,9 @@
      * <p>
      * For example: "MyKey".
      * </p>
-     * @param bundleName Only lookup in this bundle. 
+     * 
+     * @param bundleName
+     *            Only lookup in this bundle.
      * @return a ResourceBundleStringLookup instance for the given bundle name.
      * @since 1.5
      */
