diff --git a/lib/java/src/main/java/org/apache/thrift/TAsyncProcessor.java b/lib/java/src/main/java/org/apache/thrift/TAsyncProcessor.java
index 4dc9160..3d488ba 100644
--- a/lib/java/src/main/java/org/apache/thrift/TAsyncProcessor.java
+++ b/lib/java/src/main/java/org/apache/thrift/TAsyncProcessor.java
@@ -29,5 +29,5 @@
    * @param fb the frame buffer to process.
    * @throws TException if the frame cannot be processed
    */
-  public void process(final AsyncFrameBuffer fb) throws TException;
+  void process(final AsyncFrameBuffer fb) throws TException;
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/TBase.java b/lib/java/src/main/java/org/apache/thrift/TBase.java
index 9c8bdba..67c6ee8 100644
--- a/lib/java/src/main/java/org/apache/thrift/TBase.java
+++ b/lib/java/src/main/java/org/apache/thrift/TBase.java
@@ -31,7 +31,7 @@
    * @param fieldId the ID of the requested field.
    * @return F instance that corresponds to fieldId.
    */
-  public F fieldForId(int fieldId);
+  F fieldForId(int fieldId);
 
   /**
    * Check if a field is currently set or unset.
@@ -39,7 +39,7 @@
    * @param field the field to check.
    * @return true if the field is set, false otherwise.
    */
-  public boolean isSet(F field);
+  boolean isSet(F field);
 
   /**
    * Get a field's value by field variable. Primitive types will be wrapped in the appropriate
@@ -48,7 +48,7 @@
    * @param field the field whose value is requested.
    * @return the value of the requested field.
    */
-  public Object getFieldValue(F field);
+  Object getFieldValue(F field);
 
   /**
    * Set a field's value by field variable. Primitive types must be "boxed" in the appropriate
@@ -57,18 +57,18 @@
    * @param field the field whose value is to be set.
    * @param value the value to be assigned to field.
    */
-  public void setFieldValue(F field, Object value);
+  void setFieldValue(F field, Object value);
 
   /**
    * Performs a deep copy of this instance and returns the copy.
    *
    * @return a deep copy of this instance.
    */
-  public T deepCopy();
+  T deepCopy();
 
   /**
    * Return to the state of having just been initialized, as though you had just called the default
    * constructor.
    */
-  public void clear();
+  void clear();
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/TEnum.java b/lib/java/src/main/java/org/apache/thrift/TEnum.java
index 325fdec..300496d 100644
--- a/lib/java/src/main/java/org/apache/thrift/TEnum.java
+++ b/lib/java/src/main/java/org/apache/thrift/TEnum.java
@@ -20,5 +20,5 @@
 package org.apache.thrift;
 
 public interface TEnum {
-  public int getValue();
+  int getValue();
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/TEnumHelper.java b/lib/java/src/main/java/org/apache/thrift/TEnumHelper.java
index 84aa82e..b003346 100644
--- a/lib/java/src/main/java/org/apache/thrift/TEnumHelper.java
+++ b/lib/java/src/main/java/org/apache/thrift/TEnumHelper.java
@@ -19,12 +19,14 @@
 
 package org.apache.thrift;
 
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 /** Utility class with static methods for interacting with TEnum */
 public class TEnumHelper {
 
+  /* no instantiation */
+  private TEnumHelper() {}
+
   /**
    * Given a TEnum class and integer value, this method will return the associated constant from the
    * given TEnum class. This method MUST be modified should the name of the 'findByValue' method
@@ -38,11 +40,7 @@
     try {
       Method method = enumClass.getMethod("findByValue", int.class);
       return (TEnum) method.invoke(null, value);
-    } catch (NoSuchMethodException nsme) {
-      return null;
-    } catch (IllegalAccessException iae) {
-      return null;
-    } catch (InvocationTargetException ite) {
+    } catch (ReflectiveOperationException nsme) {
       return null;
     }
   }
diff --git a/lib/java/src/main/java/org/apache/thrift/TFieldIdEnum.java b/lib/java/src/main/java/org/apache/thrift/TFieldIdEnum.java
index f270630..417cd84 100644
--- a/lib/java/src/main/java/org/apache/thrift/TFieldIdEnum.java
+++ b/lib/java/src/main/java/org/apache/thrift/TFieldIdEnum.java
@@ -25,12 +25,12 @@
    *
    * @return the Thrift field id for the named field.
    */
-  public short getThriftFieldId();
+  short getThriftFieldId();
 
   /**
    * Gets the field's name, exactly as in the IDL.
    *
    * @return the field's name, exactly as in the IDL.
    */
-  public String getFieldName();
+  String getFieldName();
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/TFieldRequirementType.java b/lib/java/src/main/java/org/apache/thrift/TFieldRequirementType.java
index 065cdfc..8769dbb 100644
--- a/lib/java/src/main/java/org/apache/thrift/TFieldRequirementType.java
+++ b/lib/java/src/main/java/org/apache/thrift/TFieldRequirementType.java
@@ -21,6 +21,10 @@
 
 /** Requirement type constants. */
 public final class TFieldRequirementType {
+
+  /* no instantiation */
+  private TFieldRequirementType() {}
+
   public static final byte REQUIRED = 1;
   public static final byte OPTIONAL = 2;
   public static final byte DEFAULT = 3;
diff --git a/lib/java/src/main/java/org/apache/thrift/TNonblockingMultiFetchClient.java b/lib/java/src/main/java/org/apache/thrift/TNonblockingMultiFetchClient.java
index ffe4fa7..26ea6d0 100644
--- a/lib/java/src/main/java/org/apache/thrift/TNonblockingMultiFetchClient.java
+++ b/lib/java/src/main/java/org/apache/thrift/TNonblockingMultiFetchClient.java
@@ -69,20 +69,20 @@
 
   // if the size of the response msg exceeds this limit (in byte), we will
   // not read the msg
-  private int maxRecvBufBytesPerServer;
+  private final int maxRecvBufBytesPerServer;
 
   // time limit for fetching data from all servers (in second)
-  private int fetchTimeoutSeconds;
+  private final int fetchTimeoutSeconds;
 
   // store request that will be sent to servers
-  private ByteBuffer requestBuf;
+  private final ByteBuffer requestBuf;
   private ByteBuffer requestBufDuplication;
 
   // a list of remote servers
-  private List<InetSocketAddress> servers;
+  private final List<InetSocketAddress> servers;
 
   // store fetch results
-  private TNonblockingMultiFetchStats stats;
+  private final TNonblockingMultiFetchStats stats;
   private ByteBuffer[] recvBuf;
 
   public TNonblockingMultiFetchClient(
@@ -237,6 +237,7 @@
             try {
               s.close();
             } catch (Exception ex) {
+              LOGGER.error("failed to free up socket", ex);
             }
           }
           if (key != null) {
@@ -359,13 +360,10 @@
     public void close() {
       try {
         if (selector.isOpen()) {
-          Iterator<SelectionKey> it = selector.keys().iterator();
-          while (it.hasNext()) {
-            SelectionKey selKey = it.next();
+          for (SelectionKey selKey : selector.keys()) {
             SocketChannel sChannel = (SocketChannel) selKey.channel();
             sChannel.close();
           }
-
           selector.close();
         }
       } catch (IOException e) {
diff --git a/lib/java/src/main/java/org/apache/thrift/TNonblockingMultiFetchStats.java b/lib/java/src/main/java/org/apache/thrift/TNonblockingMultiFetchStats.java
index bc02437..304dc09 100644
--- a/lib/java/src/main/java/org/apache/thrift/TNonblockingMultiFetchStats.java
+++ b/lib/java/src/main/java/org/apache/thrift/TNonblockingMultiFetchStats.java
@@ -28,7 +28,7 @@
   private int numOverflowedRecvBuf;
   private int numInvalidFrameSize;
   // time from the beginning of fetch() function to the reading finish
-  // time of the last socket (in milli-second)
+  // time of the last socket (in millisecond)
   private long readTime;
 
   public TNonblockingMultiFetchStats() {
diff --git a/lib/java/src/main/java/org/apache/thrift/TProcessor.java b/lib/java/src/main/java/org/apache/thrift/TProcessor.java
index 3a0e6fd..96b02a4 100644
--- a/lib/java/src/main/java/org/apache/thrift/TProcessor.java
+++ b/lib/java/src/main/java/org/apache/thrift/TProcessor.java
@@ -26,5 +26,5 @@
  * stream.
  */
 public interface TProcessor {
-  public void process(TProtocol in, TProtocol out) throws TException;
+  void process(TProtocol in, TProtocol out) throws TException;
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/TSerializable.java b/lib/java/src/main/java/org/apache/thrift/TSerializable.java
index 1252804..7333d41 100644
--- a/lib/java/src/main/java/org/apache/thrift/TSerializable.java
+++ b/lib/java/src/main/java/org/apache/thrift/TSerializable.java
@@ -30,7 +30,7 @@
    * @param iprot Input protocol
    * @throws TException if there is an error reading from iprot
    */
-  public void read(TProtocol iprot) throws TException;
+  void read(TProtocol iprot) throws TException;
 
   /**
    * Writes the objects out to the protocol
@@ -38,5 +38,5 @@
    * @param oprot Output protocol
    * @throws TException if there is an error writing to oprot
    */
-  public void write(TProtocol oprot) throws TException;
+  void write(TProtocol oprot) throws TException;
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/TSerializer.java b/lib/java/src/main/java/org/apache/thrift/TSerializer.java
index 6c0c7c2..8bcd494 100644
--- a/lib/java/src/main/java/org/apache/thrift/TSerializer.java
+++ b/lib/java/src/main/java/org/apache/thrift/TSerializer.java
@@ -32,11 +32,8 @@
   /** This is the byte array that data is actually serialized into */
   private final ByteArrayOutputStream baos_ = new ByteArrayOutputStream();
 
-  /** This transport wraps that byte array */
-  private final TIOStreamTransport transport_;
-
   /** Internal protocol used for serializing objects. */
-  private TProtocol protocol_;
+  private final TProtocol protocol_;
 
   /**
    * Create a new TSerializer that uses the TBinaryProtocol by default.
@@ -51,10 +48,11 @@
    * Create a new TSerializer. It will use the TProtocol specified by the factory that is passed in.
    *
    * @param protocolFactory Factory to create a protocol
-   * @throws TTransportException if there an error initializing the underlying transport.
+   * @throws TTransportException if there is an error initializing the underlying transport.
    */
   public TSerializer(TProtocolFactory protocolFactory) throws TTransportException {
-    transport_ = new TIOStreamTransport(new TConfiguration(), baos_);
+    /* This transport wraps that byte array */
+    TIOStreamTransport transport_ = new TIOStreamTransport(new TConfiguration(), baos_);
     protocol_ = protocolFactory.getProtocol(transport_);
   }
 
@@ -66,7 +64,7 @@
    * @return Serialized object in byte[] format
    * @throws TException if an error is encountered during serialization.
    */
-  public byte[] serialize(TBase base) throws TException {
+  public byte[] serialize(TBase<?, ?> base) throws TException {
     baos_.reset();
     base.write(protocol_);
     return baos_.toByteArray();
@@ -79,7 +77,7 @@
    * @return Serialized object as a String
    * @throws TException if an error is encountered during serialization.
    */
-  public String toString(TBase base) throws TException {
+  public String toString(TBase<?, ?> base) throws TException {
     return new String(serialize(base));
   }
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/TServiceClientFactory.java b/lib/java/src/main/java/org/apache/thrift/TServiceClientFactory.java
index 1636332..54dd967 100644
--- a/lib/java/src/main/java/org/apache/thrift/TServiceClientFactory.java
+++ b/lib/java/src/main/java/org/apache/thrift/TServiceClientFactory.java
@@ -34,7 +34,7 @@
    * @param prot The protocol to use for getting T.
    * @return A brand-new T using <i>prot</i> as both the input and output protocol.
    */
-  public T getClient(TProtocol prot);
+  T getClient(TProtocol prot);
 
   /**
    * Get a brand new T using the specified input and output protocols. The input and output
@@ -44,5 +44,5 @@
    * @param oprot The output protocol to use for getting T.
    * @return a brand new T using the specified input and output protocols
    */
-  public T getClient(TProtocol iprot, TProtocol oprot);
+  T getClient(TProtocol iprot, TProtocol oprot);
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/async/TAsyncClient.java b/lib/java/src/main/java/org/apache/thrift/async/TAsyncClient.java
index 06d6f63..0bfe1c9 100644
--- a/lib/java/src/main/java/org/apache/thrift/async/TAsyncClient.java
+++ b/lib/java/src/main/java/org/apache/thrift/async/TAsyncClient.java
@@ -25,7 +25,7 @@
   protected final TProtocolFactory ___protocolFactory;
   protected final TNonblockingTransport ___transport;
   protected final TAsyncClientManager ___manager;
-  protected TAsyncMethodCall ___currentMethod;
+  protected TAsyncMethodCall<?> ___currentMethod;
   private Exception ___error;
   private long ___timeout;
 
diff --git a/lib/java/src/main/java/org/apache/thrift/async/TAsyncClientFactory.java b/lib/java/src/main/java/org/apache/thrift/async/TAsyncClientFactory.java
index 28feb73..31ca288 100644
--- a/lib/java/src/main/java/org/apache/thrift/async/TAsyncClientFactory.java
+++ b/lib/java/src/main/java/org/apache/thrift/async/TAsyncClientFactory.java
@@ -21,5 +21,5 @@
 import org.apache.thrift.transport.TNonblockingTransport;
 
 public interface TAsyncClientFactory<T extends TAsyncClient> {
-  public T getAsyncClient(TNonblockingTransport transport);
+  T getAsyncClient(TNonblockingTransport transport);
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/async/TAsyncClientManager.java b/lib/java/src/main/java/org/apache/thrift/async/TAsyncClientManager.java
index ba6a5fd..256ab26 100644
--- a/lib/java/src/main/java/org/apache/thrift/async/TAsyncClientManager.java
+++ b/lib/java/src/main/java/org/apache/thrift/async/TAsyncClientManager.java
@@ -38,15 +38,15 @@
   private static final Logger LOGGER = LoggerFactory.getLogger(TAsyncClientManager.class.getName());
 
   private final SelectThread selectThread;
-  private final ConcurrentLinkedQueue<TAsyncMethodCall> pendingCalls =
-      new ConcurrentLinkedQueue<TAsyncMethodCall>();
+  private final ConcurrentLinkedQueue<TAsyncMethodCall<?>> pendingCalls =
+      new ConcurrentLinkedQueue<>();
 
   public TAsyncClientManager() throws IOException {
     this.selectThread = new SelectThread();
     selectThread.start();
   }
 
-  public void call(TAsyncMethodCall method) throws TException {
+  public void call(TAsyncMethodCall<?> method) throws TException {
     if (!isRunning()) {
       throw new TException("SelectThread is not running");
     }
@@ -66,8 +66,8 @@
   private class SelectThread extends Thread {
     private final Selector selector;
     private volatile boolean running;
-    private final TreeSet<TAsyncMethodCall> timeoutWatchSet =
-        new TreeSet<TAsyncMethodCall>(new TAsyncMethodCallTimeoutComparator());
+    private final TreeSet<TAsyncMethodCall<?>> timeoutWatchSet =
+        new TreeSet<>(new TAsyncMethodCallTimeoutComparator());
 
     public SelectThread() throws IOException {
       this.selector = SelectorProvider.provider().openSelector();
@@ -103,7 +103,7 @@
                 // Next timeout is in the future, select and wake up then
                 selector.select(selectTime);
               } else {
-                // Next timeout is now or in past, select immediately so we can time out
+                // Next timeout is now or in the past, select immediately, so we can time out
                 selector.selectNow();
               }
             }
@@ -134,12 +134,12 @@
           keys.remove();
           if (!key.isValid()) {
             // this can happen if the method call experienced an error and the
-            // key was cancelled. can also happen if we timeout a method, which
+            // key was cancelled. can also happen if we time out a method, which
             // results in a channel close.
             // just skip
             continue;
           }
-          TAsyncMethodCall methodCall = (TAsyncMethodCall) key.attachment();
+          TAsyncMethodCall<?> methodCall = (TAsyncMethodCall<?>) key.attachment();
           methodCall.transition(key);
 
           // If done or error occurred, remove from timeout watch set
@@ -154,10 +154,10 @@
 
     // Timeout any existing method calls
     private void timeoutMethods() {
-      Iterator<TAsyncMethodCall> iterator = timeoutWatchSet.iterator();
+      Iterator<TAsyncMethodCall<?>> iterator = timeoutWatchSet.iterator();
       long currentTime = System.currentTimeMillis();
       while (iterator.hasNext()) {
-        TAsyncMethodCall methodCall = iterator.next();
+        TAsyncMethodCall<?> methodCall = iterator.next();
         if (currentTime >= methodCall.getTimeoutTimestamp()) {
           iterator.remove();
           methodCall.onError(
@@ -175,7 +175,7 @@
 
     // Start any new calls
     private void startPendingMethods() {
-      TAsyncMethodCall methodCall;
+      TAsyncMethodCall<?> methodCall;
       while ((methodCall = pendingCalls.poll()) != null) {
         // Catch registration errors. method will catch transition errors and cleanup.
         try {
@@ -196,7 +196,8 @@
 
   /** Comparator used in TreeSet */
   private static class TAsyncMethodCallTimeoutComparator
-      implements Comparator<TAsyncMethodCall>, Serializable {
+      implements Comparator<TAsyncMethodCall<?>>, Serializable {
+    @Override
     public int compare(TAsyncMethodCall left, TAsyncMethodCall right) {
       if (left.getTimeoutTimestamp() == right.getTimeoutTimestamp()) {
         return (int) (left.getSequenceId() - right.getSequenceId());
diff --git a/lib/java/src/main/java/org/apache/thrift/async/TAsyncMethodCall.java b/lib/java/src/main/java/org/apache/thrift/async/TAsyncMethodCall.java
index df586b4..9bcc8a9 100644
--- a/lib/java/src/main/java/org/apache/thrift/async/TAsyncMethodCall.java
+++ b/lib/java/src/main/java/org/apache/thrift/async/TAsyncMethodCall.java
@@ -46,9 +46,9 @@
 public abstract class TAsyncMethodCall<T> {
 
   private static final int INITIAL_MEMORY_BUFFER_SIZE = 128;
-  private static AtomicLong sequenceIdCounter = new AtomicLong(0);
+  private static final AtomicLong sequenceIdCounter = new AtomicLong(0);
 
-  public static enum State {
+  public enum State {
     CONNECTING,
     WRITING_REQUEST_SIZE,
     WRITING_REQUEST_BODY,
@@ -66,14 +66,14 @@
   protected final TAsyncClient client;
   private final AsyncMethodCallback<T> callback;
   private final boolean isOneway;
-  private long sequenceId;
+  private final long sequenceId;
   private final long timeout;
 
   private ByteBuffer sizeBuffer;
   private final byte[] sizeBufferArray = new byte[4];
   private ByteBuffer frameBuffer;
 
-  private long startTime = System.currentTimeMillis();
+  private final long startTime = System.currentTimeMillis();
 
   protected TAsyncMethodCall(
       TAsyncClient client,
@@ -177,7 +177,7 @@
    * the selector thread, we can make changes to our select interests without worrying about
    * concurrency.
    *
-   * @param key
+   * @param key selection key
    */
   void transition(SelectionKey key) {
     // Ensure key is valid
diff --git a/lib/java/src/main/java/org/apache/thrift/partial/EnumCache.java b/lib/java/src/main/java/org/apache/thrift/partial/EnumCache.java
index a56d202..4fc7562 100644
--- a/lib/java/src/main/java/org/apache/thrift/partial/EnumCache.java
+++ b/lib/java/src/main/java/org/apache/thrift/partial/EnumCache.java
@@ -34,7 +34,7 @@
  * separately on its own.
  */
 public class EnumCache {
-  private static Logger LOG = LoggerFactory.getLogger(EnumCache.class);
+  private static final Logger LOG = LoggerFactory.getLogger(EnumCache.class);
 
   private Map<Class<? extends TEnum>, Map<Integer, TEnum>> classMap;
 
diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TBase64Utils.java b/lib/java/src/main/java/org/apache/thrift/protocol/TBase64Utils.java
index a948d13..6559da1 100644
--- a/lib/java/src/main/java/org/apache/thrift/protocol/TBase64Utils.java
+++ b/lib/java/src/main/java/org/apache/thrift/protocol/TBase64Utils.java
@@ -47,7 +47,7 @@
    * @param dst the destination for the encoding
    * @param dstOff the offset into the destination to place the encoded bytes
    */
-  static final void encode(byte[] src, int srcOff, int len, byte[] dst, int dstOff) {
+  static void encode(byte[] src, int srcOff, int len, byte[] dst, int dstOff) {
     dst[dstOff] = (byte) ENCODE_TABLE.charAt((src[srcOff] >> 2) & 0x3F);
     if (len == 3) {
       dst[dstOff + 1] =
@@ -97,7 +97,7 @@
    * @param dst the destination for the decoding
    * @param dstOff the offset into the destination to place the decoded bytes
    */
-  static final void decode(byte[] src, int srcOff, int len, byte[] dst, int dstOff) {
+  static void decode(byte[] src, int srcOff, int len, byte[] dst, int dstOff) {
     dst[dstOff] =
         (byte)
             ((DECODE_TABLE[src[srcOff] & 0x0FF] << 2)
diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java b/lib/java/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java
index a2f0eac..203c016 100644
--- a/lib/java/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java
+++ b/lib/java/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java
@@ -62,7 +62,6 @@
   private static final byte[] RBRACKET = new byte[] {']'};
   private static final byte[] QUOTE = new byte[] {'"'};
   private static final byte[] BACKSLASH = new byte[] {'\\'};
-  private static final byte[] ZERO = new byte[] {'0'};
 
   private static final byte[] ESCSEQ = new byte[] {'\\', 'u', '0', '0'};
 
@@ -185,7 +184,7 @@
   // Base class for tracking JSON contexts that may require inserting/reading
   // additional JSON syntax characters
   // This base context does nothing.
-  protected class JSONBaseContext {
+  protected static class JSONBaseContext {
     protected void write() throws TException {}
 
     protected void read() throws TException {}
@@ -259,7 +258,7 @@
   protected class LookaheadReader {
 
     private boolean hasData_;
-    private byte[] data_ = new byte[1];
+    private final byte[] data_ = new byte[1];
 
     // Return and consume the next byte to be read, either taking it from the
     // data buffer if present or getting it from the transport otherwise.
@@ -284,7 +283,7 @@
   }
 
   // Stack of nested contexts that we may be in
-  private Stack<JSONBaseContext> contextStack_ = new Stack<JSONBaseContext>();
+  private final Stack<JSONBaseContext> contextStack_ = new Stack<>();
 
   // Current context that we are in
   private JSONBaseContext context_ = new JSONBaseContext();
@@ -331,7 +330,7 @@
   }
 
   // Temporary buffer used by several methods
-  private byte[] tmpbuf_ = new byte[4];
+  private final byte[] tmpbuf_ = new byte[4];
 
   // Read a byte that must match b[0]; otherwise an exception is thrown.
   // Marked protected to avoid synthetic accessor in JSONListContext.read
@@ -346,7 +345,7 @@
 
   // Convert a byte containing a hex char ('0'-'9' or 'a'-'f') into its
   // corresponding hex value
-  private static final byte hexVal(byte ch) throws TException {
+  private static byte hexVal(byte ch) throws TException {
     if ((ch >= '0') && (ch <= '9')) {
       return (byte) ((char) ch - '0');
     } else if ((ch >= 'a') && (ch <= 'f')) {
@@ -357,7 +356,7 @@
   }
 
   // Convert a byte containing a hex value to its corresponding hex character
-  private static final byte hexChar(byte val) {
+  private static byte hexChar(byte val) {
     val &= 0x0F;
     if (val < 10) {
       return (byte) ((char) val + '0');
@@ -734,7 +733,7 @@
       readJSONSyntaxChar(QUOTE);
     }
     try {
-      return Long.valueOf(str);
+      return Long.parseLong(str);
     } catch (NumberFormatException ex) {
       throw new TProtocolException(
           TProtocolException.INVALID_DATA, "Bad data encounted in numeric data");
@@ -747,7 +746,7 @@
     context_.read();
     if (reader_.peek() == QUOTE[0]) {
       TByteArrayOutputStream arr = readJSONString(true);
-      double dub = Double.valueOf(arr.toString(StandardCharsets.UTF_8));
+      double dub = Double.parseDouble(arr.toString(StandardCharsets.UTF_8));
       if (!context_.escapeNum() && !Double.isNaN(dub) && !Double.isInfinite(dub)) {
         // Throw exception -- we should not be in a string in this case
         throw new TProtocolException(
@@ -760,7 +759,7 @@
         readJSONSyntaxChar(QUOTE);
       }
       try {
-        return Double.valueOf(readJSONNumericChars());
+        return Double.parseDouble(readJSONNumericChars());
       } catch (NumberFormatException ex) {
         throw new TProtocolException(
             TProtocolException.INVALID_DATA, "Bad data encounted in numeric data");
diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TProtocolDecorator.java b/lib/java/src/main/java/org/apache/thrift/protocol/TProtocolDecorator.java
index c237ce4..bd9bd8e 100644
--- a/lib/java/src/main/java/org/apache/thrift/protocol/TProtocolDecorator.java
+++ b/lib/java/src/main/java/org/apache/thrift/protocol/TProtocolDecorator.java
@@ -265,8 +265,8 @@
   /**
    * @param type Returns the minimum amount of bytes needed to store the smallest possible instance
    *     of TType.
-   * @return
-   * @throws TException
+   * @return size
+   * @throws TException if underlying protocol throws
    */
   @Override
   public int getMinSerializedSize(byte type) throws TException {
diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java b/lib/java/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java
index 1b69032..cceb517 100644
--- a/lib/java/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java
+++ b/lib/java/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java
@@ -37,6 +37,7 @@
 
   /** Factory */
   public static class Factory implements TProtocolFactory {
+    @Override
     public TProtocol getProtocol(TTransport trans) {
       return new TSimpleJSONProtocol(trans);
     }
@@ -49,18 +50,11 @@
   private static final byte[] LBRACKET = new byte[] {'['};
   private static final byte[] RBRACKET = new byte[] {']'};
   private static final char QUOTE = '"';
-
-  private static final TStruct ANONYMOUS_STRUCT = new TStruct();
-  private static final TField ANONYMOUS_FIELD = new TField();
-  private static final TMessage EMPTY_MESSAGE = new TMessage();
-  private static final TSet EMPTY_SET = new TSet();
-  private static final TList EMPTY_LIST = new TList();
-  private static final TMap EMPTY_MAP = new TMap();
   private static final String LIST = "list";
   private static final String SET = "set";
   private static final String MAP = "map";
 
-  protected class Context {
+  protected static class Context {
     protected void write() throws TException {}
 
     /** Returns whether the current value is a key in a map */
@@ -360,8 +354,8 @@
   /**
    * Reading methods.
    *
-   * <p>simplejson is not meant to be read back into thrift - see
-   * http://wiki.apache.org/thrift/ThriftUsageJava - use JSON instead
+   * <p>simplejson is not meant to be read back into thrift - see <a
+   * href="http://wiki.apache.org/thrift/ThriftUsageJava">ThriftUsageJava</a> - use JSON instead
    */
   @Override
   public TMessage readMessageBegin() throws TException {
diff --git a/lib/java/src/main/java/org/apache/thrift/protocol/TTupleProtocol.java b/lib/java/src/main/java/org/apache/thrift/protocol/TTupleProtocol.java
index c4141a6..19d05e4 100644
--- a/lib/java/src/main/java/org/apache/thrift/protocol/TTupleProtocol.java
+++ b/lib/java/src/main/java/org/apache/thrift/protocol/TTupleProtocol.java
@@ -77,8 +77,8 @@
    * is big-endian which means the most significant bit is in element 0. The bit at index 0 of the
    * bit set is assumed to be the least significant bit.
    *
-   * @param bits
-   * @param vectorWidth
+   * @param bits bit set
+   * @param vectorWidth width of the vector
    * @return a byte array of at least length 1
    */
   public static byte[] toByteArray(BitSet bits, int vectorWidth) {
diff --git a/lib/java/src/main/java/org/apache/thrift/scheme/IScheme.java b/lib/java/src/main/java/org/apache/thrift/scheme/IScheme.java
index c4a85b9..ecf41fc 100644
--- a/lib/java/src/main/java/org/apache/thrift/scheme/IScheme.java
+++ b/lib/java/src/main/java/org/apache/thrift/scheme/IScheme.java
@@ -22,9 +22,9 @@
 
 public interface IScheme<T extends TBase> {
 
-  public void read(org.apache.thrift.protocol.TProtocol iproto, T struct)
+  void read(org.apache.thrift.protocol.TProtocol iproto, T struct)
       throws org.apache.thrift.TException;
 
-  public void write(org.apache.thrift.protocol.TProtocol oproto, T struct)
+  void write(org.apache.thrift.protocol.TProtocol oproto, T struct)
       throws org.apache.thrift.TException;
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/scheme/SchemeFactory.java b/lib/java/src/main/java/org/apache/thrift/scheme/SchemeFactory.java
index e9d7640..94b7a11 100644
--- a/lib/java/src/main/java/org/apache/thrift/scheme/SchemeFactory.java
+++ b/lib/java/src/main/java/org/apache/thrift/scheme/SchemeFactory.java
@@ -20,5 +20,5 @@
 
 public interface SchemeFactory {
 
-  public <S extends IScheme> S getScheme();
+  <S extends IScheme> S getScheme();
 }
diff --git a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java
index 01b15e8..954aaeb 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java
@@ -66,7 +66,7 @@
   /** How many bytes are currently allocated to read buffers. */
   final AtomicLong readBufferBytesAllocated = new AtomicLong(0);
 
-  public AbstractNonblockingServer(AbstractNonblockingServerArgs args) {
+  public AbstractNonblockingServer(AbstractNonblockingServerArgs<?> args) {
     super(args);
     MAX_READ_BUFFER_BYTES = args.maxReadBufferBytes;
   }
diff --git a/lib/java/src/main/java/org/apache/thrift/server/Invocation.java b/lib/java/src/main/java/org/apache/thrift/server/Invocation.java
index 64f8969..423b40b 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/Invocation.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/Invocation.java
@@ -14,6 +14,7 @@
     this.frameBuffer = frameBuffer;
   }
 
+  @Override
   public void run() {
     frameBuffer.invoke();
   }
diff --git a/lib/java/src/main/java/org/apache/thrift/server/TExtensibleServlet.java b/lib/java/src/main/java/org/apache/thrift/server/TExtensibleServlet.java
index 5c14100..fa5acac 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/TExtensibleServlet.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/TExtensibleServlet.java
@@ -52,8 +52,6 @@
 
   private TProtocolFactory inFactory;
 
-  private TProtocolFactory outFactory;
-
   private Collection<Map.Entry<String, String>> customHeaders;
 
   /**
@@ -85,7 +83,7 @@
     super.init(config); // no-args init() happens here
     this.processor = getProcessor();
     this.inFactory = getInProtocolFactory();
-    this.outFactory = getOutProtocolFactory();
+    TProtocolFactory outFactory = getOutProtocolFactory();
     this.customHeaders = new ArrayList<Map.Entry<String, String>>();
 
     if (processor == null) {
@@ -105,8 +103,8 @@
   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
-    TTransport inTransport = null;
-    TTransport outTransport = null;
+    TTransport inTransport;
+    TTransport outTransport;
 
     try {
       response.setContentType("application/x-thrift");
@@ -146,14 +144,17 @@
   public void addCustomHeader(final String key, final String value) {
     this.customHeaders.add(
         new Map.Entry<String, String>() {
+          @Override
           public String getKey() {
             return key;
           }
 
+          @Override
           public String getValue() {
             return value;
           }
 
+          @Override
           public String setValue(String value) {
             return null;
           }
diff --git a/lib/java/src/main/java/org/apache/thrift/server/TNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/TNonblockingServer.java
index fa75569..5c015eb 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/TNonblockingServer.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/TNonblockingServer.java
@@ -47,7 +47,7 @@
 
   private SelectAcceptThread selectAcceptThread_;
 
-  public TNonblockingServer(AbstractNonblockingServerArgs args) {
+  public TNonblockingServer(AbstractNonblockingServerArgs<?> args) {
     super(args);
   }
 
@@ -132,6 +132,7 @@
      * The work loop. Handles both selecting (all IO operations) and managing the selection
      * preferences of all existing connections.
      */
+    @Override
     public void run() {
       try {
         if (eventHandler_ != null) {
diff --git a/lib/java/src/main/java/org/apache/thrift/server/TServlet.java b/lib/java/src/main/java/org/apache/thrift/server/TServlet.java
index c025a49..831842b 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/TServlet.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/TServlet.java
@@ -87,6 +87,7 @@
   /**
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    */
+  @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
     doPost(request, response);
@@ -95,14 +96,17 @@
   public void addCustomHeader(final String key, final String value) {
     this.customHeaders.add(
         new Map.Entry<String, String>() {
+          @Override
           public String getKey() {
             return key;
           }
 
+          @Override
           public String getValue() {
             return value;
           }
 
+          @Override
           public String setValue(String value) {
             return null;
           }
diff --git a/lib/java/src/main/java/org/apache/thrift/server/TSimpleServer.java b/lib/java/src/main/java/org/apache/thrift/server/TSimpleServer.java
index 3530d6d..69af88a 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/TSimpleServer.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/TSimpleServer.java
@@ -36,6 +36,7 @@
     super(args);
   }
 
+  @Override
   public void serve() {
     try {
       serverTransport_.listen();
diff --git a/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java b/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java
index 357410f..82d3a29 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java
@@ -82,7 +82,7 @@
   }
 
   // Executor service for handling client connections
-  private ExecutorService executorService_;
+  private final ExecutorService executorService_;
 
   private final TimeUnit stopTimeoutUnit;
 
@@ -140,6 +140,7 @@
     return true;
   }
 
+  @Override
   public void serve() {
     if (!preServe()) {
       return;
@@ -196,6 +197,7 @@
     return false;
   }
 
+  @Override
   public void stop() {
     stopped_ = true;
     serverTransport_.interrupt();
@@ -204,7 +206,7 @@
   private class WorkerProcess implements Runnable {
 
     /** Client that this services. */
-    private TTransport client_;
+    private final TTransport client_;
 
     /**
      * Default constructor.
@@ -216,6 +218,7 @@
     }
 
     /** Loops on processing a client forever */
+    @Override
     public void run() {
       TProcessor processor = null;
       TTransport inputTransport = null;
diff --git a/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java b/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java
index 0a4d857..ae3d292 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java
@@ -50,10 +50,10 @@
  * reading and writing of client connections. A synchronous worker thread pool handles processing of
  * requests.
  *
- * <p>Performs better than TNonblockingServer/THsHaServer in multi-core environments when the the
+ * <p>Performs better than TNonblockingServer/THsHaServer in multi-core environments when the
  * bottleneck is CPU on the single selector thread handling I/O. In addition, because the accept
  * handling is decoupled from reads/writes and invocation, the server has better ability to handle
- * back- pressure from new connections (e.g. stop accepting when busy).
+ * back-pressure from new connections (e.g. stop accepting when busy).
  *
  * <p>Like TNonblockingServer, it relies on the use of TFramedTransport.
  */
@@ -183,7 +183,7 @@
   private AcceptThread acceptThread;
 
   // Threads handling events on client transports
-  private final Set<SelectorThread> selectorThreads = new HashSet<SelectorThread>();
+  private final Set<SelectorThread> selectorThreads = new HashSet<>();
 
   // This wraps all the functionality of queueing and thread pool management
   // for the passing of Invocations from the selector thread(s) to the workers
@@ -257,10 +257,8 @@
     if (acceptThread != null) {
       acceptThread.wakeupSelector();
     }
-    if (selectorThreads != null) {
-      for (SelectorThread thread : selectorThreads) {
-        if (thread != null) thread.wakeupSelector();
-      }
+    for (SelectorThread thread : selectorThreads) {
+      if (thread != null) thread.wakeupSelector();
     }
   }
 
@@ -341,7 +339,7 @@
     /**
      * Set up the AcceptThead
      *
-     * @throws IOException
+     * @throws IOException if failed to register selector
      */
     public AcceptThread(
         TNonblockingServerTransport serverTransport, SelectorThreadLoadBalancer threadChooser)
@@ -464,8 +462,8 @@
 
     // Accepted connections added by the accept thread.
     private final BlockingQueue<TNonblockingTransport> acceptedQueue;
-    private int SELECTOR_AUTO_REBUILD_THRESHOLD = 512;
-    private long MONITOR_PERIOD = 1000L;
+    private static final int SELECTOR_AUTO_REBUILD_THRESHOLD = 512;
+    private static final long MONITOR_PERIOD = 1000L;
     private int jvmBug = 0;
 
     /**
@@ -581,7 +579,8 @@
     }
 
     /**
-     * Do select and judge epoll bug happen. See : https://issues.apache.org/jira/browse/THRIFT-4251
+     * Do select and judge epoll bug happen. See <a
+     * href="https://issues.apache.org/jira/browse/THRIFT-4251">THRIFT-4251</a>
      */
     private void doSelect() throws IOException {
       long beforeSelect = System.currentTimeMillis();
diff --git a/lib/java/src/main/java/org/apache/thrift/transport/TSSLTransportFactory.java b/lib/java/src/main/java/org/apache/thrift/transport/TSSLTransportFactory.java
index 917f4c9..b44bb40 100644
--- a/lib/java/src/main/java/org/apache/thrift/transport/TSSLTransportFactory.java
+++ b/lib/java/src/main/java/org/apache/thrift/transport/TSSLTransportFactory.java
@@ -53,9 +53,9 @@
    * -Djavax.net.ssl.trustStorePassword=password -Djavax.net.ssl.keyStore=&lt;keystore location&gt;
    * -Djavax.net.ssl.keyStorePassword=password
    *
-   * @param port
+   * @param port server port
    * @return A SSL wrapped TServerSocket
-   * @throws TTransportException
+   * @throws TTransportException when failed to create server socket
    */
   public static TServerSocket getServerSocket(int port) throws TTransportException {
     return getServerSocket(port, 0);
@@ -264,7 +264,7 @@
     } catch (FileNotFoundException e) {
     }
 
-    InputStream storeStream = null;
+    InputStream storeStream;
     try {
       storeStream = new URL(store).openStream();
       if (storeStream != null) {
diff --git a/lib/java/src/main/java/org/apache/thrift/transport/TSimpleFileTransport.java b/lib/java/src/main/java/org/apache/thrift/transport/TSimpleFileTransport.java
index 9dfdb82..cd6be66 100644
--- a/lib/java/src/main/java/org/apache/thrift/transport/TSimpleFileTransport.java
+++ b/lib/java/src/main/java/org/apache/thrift/transport/TSimpleFileTransport.java
@@ -26,9 +26,9 @@
 public final class TSimpleFileTransport extends TEndpointTransport {
 
   private RandomAccessFile file = null;
-  private boolean readable;
-  private boolean writable;
-  private String path_;
+  private final boolean readable;
+  private final boolean writable;
+  private final String path_;
 
   /**
    * Create a transport backed by a simple file
diff --git a/lib/java/src/main/java/org/apache/thrift/transport/layered/TFramedTransport.java b/lib/java/src/main/java/org/apache/thrift/transport/layered/TFramedTransport.java
index 6ba4018..a3c1bcc 100644
--- a/lib/java/src/main/java/org/apache/thrift/transport/layered/TFramedTransport.java
+++ b/lib/java/src/main/java/org/apache/thrift/transport/layered/TFramedTransport.java
@@ -40,7 +40,7 @@
   private final TMemoryInputTransport readBuffer_;
 
   public static class Factory extends TTransportFactory {
-    private int maxLength_;
+    private final int maxLength_;
 
     public Factory() {
       maxLength_ = TConfiguration.DEFAULT_MAX_FRAME_SIZE;
@@ -170,14 +170,14 @@
     getInnerTransport().flush();
   }
 
-  public static final void encodeFrameSize(final int frameSize, final byte[] buf) {
+  public static void encodeFrameSize(final int frameSize, final byte[] buf) {
     buf[0] = (byte) (0xff & (frameSize >> 24));
     buf[1] = (byte) (0xff & (frameSize >> 16));
     buf[2] = (byte) (0xff & (frameSize >> 8));
     buf[3] = (byte) (0xff & (frameSize));
   }
 
-  public static final int decodeFrameSize(final byte[] buf) {
+  public static int decodeFrameSize(final byte[] buf) {
     return ((buf[0] & 0xff) << 24)
         | ((buf[1] & 0xff) << 16)
         | ((buf[2] & 0xff) << 8)
diff --git a/lib/java/src/main/java/org/apache/thrift/transport/layered/TLayeredTransport.java b/lib/java/src/main/java/org/apache/thrift/transport/layered/TLayeredTransport.java
index 6e3d196..5ab4c95 100644
--- a/lib/java/src/main/java/org/apache/thrift/transport/layered/TLayeredTransport.java
+++ b/lib/java/src/main/java/org/apache/thrift/transport/layered/TLayeredTransport.java
@@ -25,8 +25,9 @@
 
 public abstract class TLayeredTransport extends TTransport {
 
-  private TTransport innerTransport;
+  private final TTransport innerTransport;
 
+  @Override
   public TConfiguration getConfiguration() {
     return innerTransport.getConfiguration();
   }
@@ -36,10 +37,12 @@
     innerTransport = transport;
   }
 
+  @Override
   public void updateKnownMessageSize(long size) throws TTransportException {
     innerTransport.updateKnownMessageSize(size);
   }
 
+  @Override
   public void checkReadBytesAvailable(long numBytes) throws TTransportException {
     innerTransport.checkReadBytesAvailable(numBytes);
   }
diff --git a/lib/java/src/main/java/org/apache/thrift/transport/sasl/DataFrameWriter.java b/lib/java/src/main/java/org/apache/thrift/transport/sasl/DataFrameWriter.java
index b79537d..9f2168a 100644
--- a/lib/java/src/main/java/org/apache/thrift/transport/sasl/DataFrameWriter.java
+++ b/lib/java/src/main/java/org/apache/thrift/transport/sasl/DataFrameWriter.java
@@ -35,7 +35,7 @@
   public void withOnlyPayload(byte[] payload, int offset, int length) {
     if (!isComplete()) {
       throw new IllegalStateException(
-          "Previsous write is not yet complete, with " + frameBytes.remaining() + " bytes left.");
+          "Previous write is not yet complete, with " + frameBytes.remaining() + " bytes left.");
     }
     frameBytes = buildFrameWithPayload(payload, offset, length);
   }
diff --git a/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java b/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java
index 44862d2..da82c89 100644
--- a/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java
+++ b/lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java
@@ -215,7 +215,7 @@
     selectionKey.interestOps(selectionInterest);
   }
 
-  // sasl negotiaion failure handling
+  // sasl negotiation failure handling
   private void failSaslNegotiation(TSaslNegotiationException e) {
     LOGGER.error("Sasl negotiation failed", e);
     String errorMsg = e.getDetails();
@@ -494,7 +494,7 @@
     };
 
     // The interest on the selection key during the phase
-    private int selectionInterest;
+    private final int selectionInterest;
 
     Phase(int selectionInterest) {
       this.selectionInterest = selectionInterest;
