diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/W3CRDFSyntax.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/W3CRDFSyntax.java
index 6794fac..e2f012c 100644
--- a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/W3CRDFSyntax.java
+++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/W3CRDFSyntax.java
@@ -46,7 +46,7 @@
      * format</a>.
      */
     private final static class FormatIRI implements IRI {
-        private static String BASE = "http://www.w3.org/ns/formats/";
+        private static final String BASE = "http://www.w3.org/ns/formats/";
         private final String format;
 
         private FormatIRI(final String format) {
diff --git a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java
index 3bc3dc5..a7511c7 100644
--- a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java
+++ b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java
@@ -76,7 +76,7 @@
  */
 public final class JenaRDF implements RDF {
 
-    private static InternalJenaFactory internalJenaFactory = new InternalJenaFactory() {
+    private static final InternalJenaFactory INTERNAL_JENA_FACTORY = new InternalJenaFactory() {
     };
 
     private final UUID salt;
@@ -108,49 +108,49 @@
 
     @Override
     public JenaBlankNode createBlankNode() {
-        return internalJenaFactory.createBlankNode(salt());
+        return INTERNAL_JENA_FACTORY.createBlankNode(salt());
     }
 
     @Override
     public JenaBlankNode createBlankNode(final String name) {
-        return internalJenaFactory.createBlankNode(name, salt());
+        return INTERNAL_JENA_FACTORY.createBlankNode(name, salt());
     }
 
     @Override
     public JenaDataset createDataset() {
-        return internalJenaFactory.createDataset(salt());
+        return INTERNAL_JENA_FACTORY.createDataset(salt());
     }
 
     @Override
     public JenaGraph createGraph() {
-        return internalJenaFactory.createGraph(salt());
+        return INTERNAL_JENA_FACTORY.createGraph(salt());
     }
 
     @Override
     public JenaIRI createIRI(final String iri) {
         validateIRI(iri);
-        return internalJenaFactory.createIRI(iri);
+        return INTERNAL_JENA_FACTORY.createIRI(iri);
     }
 
     @Override
     public JenaLiteral createLiteral(final String lexicalForm) {
-        return internalJenaFactory.createLiteral(lexicalForm);
+        return INTERNAL_JENA_FACTORY.createLiteral(lexicalForm);
     }
 
     @Override
     public JenaLiteral createLiteral(final String lexicalForm, final IRI dataType) {
-        return internalJenaFactory.createLiteralDT(lexicalForm, dataType.getIRIString());
+        return INTERNAL_JENA_FACTORY.createLiteralDT(lexicalForm, dataType.getIRIString());
     }
 
     @Override
     public JenaLiteral createLiteral(final String lexicalForm, final String languageTag) {
         validateLang(languageTag);
-        return internalJenaFactory.createLiteralLang(lexicalForm, languageTag);
+        return INTERNAL_JENA_FACTORY.createLiteralLang(lexicalForm, languageTag);
     }
 
     @Override
     public JenaTriple createTriple(final BlankNodeOrIRI subject, final IRI predicate, final RDFTerm object) {
-        return internalJenaFactory.createTriple(subject, predicate, object);
+        return INTERNAL_JENA_FACTORY.createTriple(subject, predicate, object);
     }
 
     /**
@@ -168,7 +168,7 @@
     @Override
     public JenaQuad createQuad(final BlankNodeOrIRI graphName, final BlankNodeOrIRI subject, final IRI predicate, final RDFTerm object)
             throws IllegalArgumentException, UnsupportedOperationException {
-        return internalJenaFactory.createQuad(subject, predicate, object, graphName);
+        return INTERNAL_JENA_FACTORY.createQuad(subject, predicate, object, graphName);
     }
 
     /**
@@ -192,7 +192,7 @@
      *         or {@link Triple#hashCode()}.
      */
     public JenaGeneralizedTripleLike createGeneralizedTriple(final RDFTerm subject, final RDFTerm predicate, final RDFTerm object) {
-        return internalJenaFactory.createGeneralizedTriple(subject, predicate, object);
+        return INTERNAL_JENA_FACTORY.createGeneralizedTriple(subject, predicate, object);
     }
 
     /**
@@ -227,7 +227,7 @@
      */
     public JenaGeneralizedQuadLike createGeneralizedQuad(final RDFTerm subject, final RDFTerm predicate, final RDFTerm object,
             final RDFTerm graphName) {
-        return internalJenaFactory.createGeneralizedQuad(subject, predicate, object, graphName);
+        return INTERNAL_JENA_FACTORY.createGeneralizedQuad(subject, predicate, object, graphName);
     }
 
     /**
@@ -252,7 +252,7 @@
      *             represents a variable in Jena.
      */
     public JenaRDFTerm asRDFTerm(final Node node) throws ConversionException {
-        return internalJenaFactory.createRDFTerm(node, salt());
+        return INTERNAL_JENA_FACTORY.createRDFTerm(node, salt());
     }
 
     /**
@@ -323,7 +323,7 @@
      *             is a generalized triple
      */
     public JenaTriple asTriple(final org.apache.jena.graph.Triple triple) throws ConversionException {
-        return internalJenaFactory.createTriple(triple, salt());
+        return INTERNAL_JENA_FACTORY.createTriple(triple, salt());
     }
 
     /**
@@ -351,7 +351,7 @@
      *             if any of the triple's nodes are not concrete
      */
     public JenaTripleLike asGeneralizedTriple(final org.apache.jena.graph.Triple triple) throws ConversionException {
-        return internalJenaFactory.createGeneralizedTriple(triple, salt());
+        return INTERNAL_JENA_FACTORY.createGeneralizedTriple(triple, salt());
     }
 
     /**
@@ -384,7 +384,7 @@
      *             if any of the quad nodes are not concrete
      */
     public JenaQuadLike<RDFTerm> asGeneralizedQuad(final org.apache.jena.sparql.core.Quad quad) throws ConversionException {
-        return internalJenaFactory.createGeneralizedQuad(quad, salt());
+        return INTERNAL_JENA_FACTORY.createGeneralizedQuad(quad, salt());
     }
 
     /**
@@ -443,7 +443,7 @@
      * @return Adapted quad
      */
     public JenaQuad asQuad(final org.apache.jena.sparql.core.Quad quad) {
-        return internalJenaFactory.createQuad(quad, salt());
+        return INTERNAL_JENA_FACTORY.createQuad(quad, salt());
     }
 
     /**
@@ -464,7 +464,7 @@
      * @return Adapted {@link JenaGraph}
      */
     public JenaGraph asGraph(final org.apache.jena.graph.Graph graph) {
-        return internalJenaFactory.createGraph(graph, salt());
+        return INTERNAL_JENA_FACTORY.createGraph(graph, salt());
     }
 
     /**
@@ -485,7 +485,7 @@
      * @return Adapted {@link JenaGraph}
      */
     public JenaGraph asGraph(final org.apache.jena.rdf.model.Model model) {
-        return internalJenaFactory.createGraph(model, salt());
+        return INTERNAL_JENA_FACTORY.createGraph(model, salt());
     }
 
     /**
@@ -507,7 +507,7 @@
      * @return Adapted {@link JenaDataset}
      */
     public JenaDataset asDataset(final DatasetGraph datasetGraph) {
-        return internalJenaFactory.createDataset(datasetGraph, salt());
+        return INTERNAL_JENA_FACTORY.createDataset(datasetGraph, salt());
     }
 
     /**
@@ -529,7 +529,7 @@
      * @return Adapted {@link JenaDataset}
      */
     public JenaDataset asDataset(final org.apache.jena.query.Dataset datasetGraph) {
-        return internalJenaFactory.createDataset(datasetGraph.asDatasetGraph(), salt());
+        return INTERNAL_JENA_FACTORY.createDataset(datasetGraph.asDatasetGraph(), salt());
     }
 
     /**
diff --git a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/AbstractQuadLike.java b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/AbstractQuadLike.java
index b05bf5c..41e8509 100644
--- a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/AbstractQuadLike.java
+++ b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/AbstractQuadLike.java
@@ -50,7 +50,7 @@
 abstract class AbstractQuadLike<S extends RDFTerm, P extends RDFTerm, O extends RDFTerm, G extends RDFTerm>
         implements JenaQuadLike<G> {
 
-    private static InternalJenaFactory internalJenaFactory = new InternalJenaFactory() {
+    private static final InternalJenaFactory INTERNAL_JENA_FACTORY = new InternalJenaFactory() {
     };
 
     /**
@@ -65,8 +65,8 @@
     private static class DefaultGraphChecker {
         // Fixed UUID for comparison of defaultGraphNodeGenerated
         private final UUID salt = UUID.fromString("aaa6bf96-ea58-4a55-9485-3733403a1f24");
-        private final RDFTerm defaultGraph = internalJenaFactory.createRDFTerm(Quad.defaultGraphIRI, salt);
-        private final RDFTerm defaultGraphNodeGenerated = internalJenaFactory.createRDFTerm(Quad.defaultGraphNodeGenerated, salt);
+        private final RDFTerm defaultGraph = INTERNAL_JENA_FACTORY.createRDFTerm(Quad.defaultGraphIRI, salt);
+        private final RDFTerm defaultGraphNodeGenerated = INTERNAL_JENA_FACTORY.createRDFTerm(Quad.defaultGraphNodeGenerated, salt);
 
         /**
          * Check if RDFTerm is an IRI that matches the two Jena default graph
@@ -99,7 +99,7 @@
         }
     }
 
-    private static DefaultGraphChecker defaultGraphChecker = new DefaultGraphChecker();
+    private static final DefaultGraphChecker DEFAULT_GRAPH_CHECKER = new DefaultGraphChecker();
 
     final Optional<G> graphName;
     final S subject;
@@ -114,7 +114,7 @@
         this.predicate = Objects.requireNonNull(predicate);
         this.object = Objects.requireNonNull(object);
         // Enforce
-        this.graphName = Objects.requireNonNull(graphName).filter(defaultGraphChecker::isNotDefaultGraphJenaNode);
+        this.graphName = Objects.requireNonNull(graphName).filter(DEFAULT_GRAPH_CHECKER::isNotDefaultGraphJenaNode);
     }
 
     AbstractQuadLike(final S subject, final P predicate, final O object) {
@@ -124,22 +124,22 @@
     @SuppressWarnings("unchecked")
     AbstractQuadLike(final org.apache.jena.sparql.core.Quad quad, final UUID salt) {
         this.quad = Objects.requireNonNull(quad);
-        this.subject = (S) internalJenaFactory.createRDFTerm(quad.getSubject(), salt);
-        this.predicate = (P) internalJenaFactory.createRDFTerm(quad.getPredicate(), salt);
-        this.object = (O) internalJenaFactory.createRDFTerm(quad.getObject(), salt);
+        this.subject = (S) INTERNAL_JENA_FACTORY.createRDFTerm(quad.getSubject(), salt);
+        this.predicate = (P) INTERNAL_JENA_FACTORY.createRDFTerm(quad.getPredicate(), salt);
+        this.object = (O) INTERNAL_JENA_FACTORY.createRDFTerm(quad.getObject(), salt);
         if (quad.isDefaultGraph()) {
             this.graphName = Optional.empty();
         } else {
-            this.graphName = Optional.of((G) internalJenaFactory.createRDFTerm(quad.getGraph(), salt));
+            this.graphName = Optional.of((G) INTERNAL_JENA_FACTORY.createRDFTerm(quad.getGraph(), salt));
         }
     }
 
     @SuppressWarnings("unchecked")
     AbstractQuadLike(final org.apache.jena.graph.Triple triple, final UUID salt) {
         this.triple = Objects.requireNonNull(triple);
-        this.subject = (S) internalJenaFactory.createRDFTerm(triple.getSubject(), salt);
-        this.predicate = (P) internalJenaFactory.createRDFTerm(triple.getPredicate(), salt);
-        this.object = (O) internalJenaFactory.createRDFTerm(triple.getObject(), salt);
+        this.subject = (S) INTERNAL_JENA_FACTORY.createRDFTerm(triple.getSubject(), salt);
+        this.predicate = (P) INTERNAL_JENA_FACTORY.createRDFTerm(triple.getPredicate(), salt);
+        this.object = (O) INTERNAL_JENA_FACTORY.createRDFTerm(triple.getObject(), salt);
         this.graphName = Optional.empty();
     }
 
diff --git a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/JenaLiteralImpl.java b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/JenaLiteralImpl.java
index 44f3814..95df4dc 100644
--- a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/JenaLiteralImpl.java
+++ b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/JenaLiteralImpl.java
@@ -29,7 +29,7 @@
 
 class JenaLiteralImpl extends AbstractJenaRDFTerm implements JenaLiteral {
 
-    private static InternalJenaFactory internalJenaFactory = new InternalJenaFactory() {
+    private static final InternalJenaFactory INTERNAL_JENA_FACTORY = new InternalJenaFactory() {
     };
 
     JenaLiteralImpl(final Node node) {
@@ -63,7 +63,7 @@
 
     @Override
     public IRI getDatatype() {
-        return internalJenaFactory.createIRI(asJenaNode().getLiteralDatatype().getURI());
+        return INTERNAL_JENA_FACTORY.createIRI(asJenaNode().getLiteralDatatype().getURI());
     }
 
     @Override
diff --git a/commons-rdf-jsonld-java/src/main/java/org/apache/commons/rdf/jsonldjava/JsonLdGraphLike.java b/commons-rdf-jsonld-java/src/main/java/org/apache/commons/rdf/jsonldjava/JsonLdGraphLike.java
index b29dae9..ca30739 100644
--- a/commons-rdf-jsonld-java/src/main/java/org/apache/commons/rdf/jsonldjava/JsonLdGraphLike.java
+++ b/commons-rdf-jsonld-java/src/main/java/org/apache/commons/rdf/jsonldjava/JsonLdGraphLike.java
@@ -63,7 +63,7 @@
     /**
      * Used by {@link #bnodePrefix()} to get a unique UUID per JVM run
      */
-    private static UUID SALT = UUID.randomUUID();
+    private static final UUID SALT = UUID.randomUUID();
 
     /**
      * Prefix to use in blank node identifiers
diff --git a/commons-rdf-jsonld-java/src/main/java/org/apache/commons/rdf/jsonldjava/JsonLdQuadLike.java b/commons-rdf-jsonld-java/src/main/java/org/apache/commons/rdf/jsonldjava/JsonLdQuadLike.java
index d662974..2367810 100644
--- a/commons-rdf-jsonld-java/src/main/java/org/apache/commons/rdf/jsonldjava/JsonLdQuadLike.java
+++ b/commons-rdf-jsonld-java/src/main/java/org/apache/commons/rdf/jsonldjava/JsonLdQuadLike.java
@@ -33,7 +33,7 @@
 
     // Note: We always pass the blankNodePrefix and don't rely on the internal
     // blankNodePrefix in this static factory
-    private static JsonLdRDF rdfTermFactory = new JsonLdRDF();
+    private static final JsonLdRDF RDF_TERM_FACTORY = new JsonLdRDF();
 
     private final Quad quad;
     private final String blankNodePrefix;
@@ -46,26 +46,26 @@
     @SuppressWarnings("unchecked")
     @Override
     public Optional<G> getGraphName() {
-        final G g = (G) rdfTermFactory.asRDFTerm(quad.getGraph(), blankNodePrefix);
+        final G g = (G) RDF_TERM_FACTORY.asRDFTerm(quad.getGraph(), blankNodePrefix);
         return Optional.ofNullable(g);
     }
 
     @SuppressWarnings("unchecked")
     @Override
     public S getSubject() {
-        return (S) rdfTermFactory.asRDFTerm(quad.getSubject(), blankNodePrefix);
+        return (S) RDF_TERM_FACTORY.asRDFTerm(quad.getSubject(), blankNodePrefix);
     }
 
     @SuppressWarnings("unchecked")
     @Override
     public P getPredicate() {
-        return (P) rdfTermFactory.asRDFTerm(quad.getPredicate(), blankNodePrefix);
+        return (P) RDF_TERM_FACTORY.asRDFTerm(quad.getPredicate(), blankNodePrefix);
     }
 
     @SuppressWarnings("unchecked")
     @Override
     public O getObject() {
-        return (O) rdfTermFactory.asRDFTerm(quad.getObject(), blankNodePrefix);
+        return (O) RDF_TERM_FACTORY.asRDFTerm(quad.getObject(), blankNodePrefix);
     }
 
     @Override
diff --git a/commons-rdf-rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4J.java b/commons-rdf-rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4J.java
index b72464e..a310f23 100644
--- a/commons-rdf-rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4J.java
+++ b/commons-rdf-rdf4j/src/main/java/org/apache/commons/rdf/rdf4j/RDF4J.java
@@ -107,7 +107,7 @@
     /**
      * InternalRDF4JFactory is deliberately abstract
      */
-    private static InternalRDF4JFactory rdf4j = new InternalRDF4JFactory() {
+    private static final InternalRDF4JFactory RDF4J = new InternalRDF4JFactory() {
     };
 
     public enum Option {
@@ -200,7 +200,7 @@
      * @return A {@link RDF4JQuad} that is equivalent to the statement
      */
     public RDF4JQuad asQuad(final Statement statement) {
-        return rdf4j.createQuadImpl(statement, salt);
+        return RDF4J.createQuadImpl(statement, salt);
     }
 
     /**
@@ -256,7 +256,7 @@
      * @return A {@link RDF4JBlankNode} that corresponds to the RDF4J BNode
      */
     public RDF4JBlankNode asRDFTerm(final BNode value) {
-        return rdf4j.createBlankNodeImpl(value, salt);
+        return RDF4J.createBlankNodeImpl(value, salt);
     }
 
     /**
@@ -270,7 +270,7 @@
      * @return A {@link RDF4JLiteral} that corresponds to the RDF4J literal
      */
     public RDF4JLiteral asRDFTerm(final Literal value) {
-        return rdf4j.createLiteralImpl(value);
+        return RDF4J.createLiteralImpl(value);
     }
 
     /**
@@ -284,7 +284,7 @@
      * @return A {@link RDF4JIRI} that corresponds to the RDF4J IRI
      */
     public RDF4JIRI asRDFTerm(final org.eclipse.rdf4j.model.IRI value) {
-        return rdf4j.createIRIImpl(value);
+        return RDF4J.createIRIImpl(value);
     }
 
     /**
@@ -331,13 +331,13 @@
      */
     public static RDF4JTerm asRDFTerm(final Value value, final UUID salt) {
         if (value instanceof BNode) {
-            return rdf4j.createBlankNodeImpl((BNode) value, salt);
+            return RDF4J.createBlankNodeImpl((BNode) value, salt);
         }
         if (value instanceof org.eclipse.rdf4j.model.Literal) {
-            return rdf4j.createLiteralImpl((org.eclipse.rdf4j.model.Literal) value);
+            return RDF4J.createLiteralImpl((org.eclipse.rdf4j.model.Literal) value);
         }
         if (value instanceof org.eclipse.rdf4j.model.IRI) {
-            return rdf4j.createIRIImpl((org.eclipse.rdf4j.model.IRI) value);
+            return RDF4J.createIRIImpl((org.eclipse.rdf4j.model.IRI) value);
         }
         throw new IllegalArgumentException("Value is not a BNode, Literal or IRI: " + value.getClass());
     }
@@ -360,7 +360,7 @@
      */
     public RDF4JDataset asDataset(final Repository repository, final Option... options) {
         final EnumSet<Option> opts = optionSet(options);
-        return rdf4j.createRepositoryDatasetImpl(repository, opts.contains(Option.handleInitAndShutdown),
+        return RDF4J.createRepositoryDatasetImpl(repository, opts.contains(Option.handleInitAndShutdown),
                 opts.contains(Option.includeInferred));
     }
 
@@ -374,7 +374,7 @@
      * @return Adapted {@link Graph}.
      */
     public RDF4JGraph asGraph(final Model model) {
-        return rdf4j.createModelGraphImpl(model, this);
+        return RDF4J.createModelGraphImpl(model, this);
     }
 
     /**
@@ -398,7 +398,7 @@
      */
     public RDF4JGraph asGraph(final Repository repository, final Option... options) {
         final EnumSet<Option> opts = optionSet(options);
-        return rdf4j.createRepositoryGraphImpl(repository, opts.contains(Option.handleInitAndShutdown),
+        return RDF4J.createRepositoryGraphImpl(repository, opts.contains(Option.handleInitAndShutdown),
                 opts.contains(Option.includeInferred), new Resource[] { null }); // default
                                                                                  // graph
     }
@@ -418,7 +418,7 @@
      */
     public RDF4JGraph asGraphUnion(final Repository repository, final Option... options) {
         final EnumSet<Option> opts = optionSet(options);
-        return rdf4j.createRepositoryGraphImpl(repository, opts.contains(Option.handleInitAndShutdown),
+        return RDF4J.createRepositoryGraphImpl(repository, opts.contains(Option.handleInitAndShutdown),
                 opts.contains(Option.includeInferred), new Resource[] {}); // union
                                                                            // graph
 
@@ -453,7 +453,7 @@
         final EnumSet<Option> opts = optionSet(option);
         /** NOTE: asValue() deliberately CAN handle <code>null</code> */
         final Resource[] resources = contexts.stream().map(g -> (Resource) asValue(g)).toArray(Resource[]::new);
-        return rdf4j.createRepositoryGraphImpl(Objects.requireNonNull(repository),
+        return RDF4J.createRepositoryGraphImpl(Objects.requireNonNull(repository),
                 opts.contains(Option.handleInitAndShutdown), opts.contains(Option.includeInferred), resources);
     }
 
@@ -510,7 +510,7 @@
      * @return A {@link RDF4JTriple} that is equivalent to the statement
      */
     public RDF4JTriple asTriple(final Statement statement) {
-        return rdf4j.createTripleImpl(statement, salt);
+        return RDF4J.createTripleImpl(statement, salt);
     }
 
     /**
@@ -595,7 +595,7 @@
     public RDF4JDataset createDataset() {
         final Sail sail = new MemoryStore();
         final Repository repository = new SailRepository(sail);
-        return rdf4j.createRepositoryDatasetImpl(repository, true, false);
+        return RDF4J.createRepositoryDatasetImpl(repository, true, false);
     }
 
     @Override
diff --git a/commons-rdf-simple/src/main/java/org/apache/commons/rdf/simple/experimental/AbstractRDFParser.java b/commons-rdf-simple/src/main/java/org/apache/commons/rdf/simple/experimental/AbstractRDFParser.java
index a5d3624..d802852 100644
--- a/commons-rdf-simple/src/main/java/org/apache/commons/rdf/simple/experimental/AbstractRDFParser.java
+++ b/commons-rdf-simple/src/main/java/org/apache/commons/rdf/simple/experimental/AbstractRDFParser.java
@@ -62,7 +62,7 @@
     private static final ExecutorService threadpool = Executors.newCachedThreadPool(r -> new Thread(threadGroup, r));
 
     // Basically only used for creating IRIs
-    private static RDF internalRdfTermFactory = new SimpleRDF();
+    private static final RDF internalRdfTermFactory = new SimpleRDF();
 
     /**
      * Get the set {@link RDF}, if any.
diff --git a/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/BlankNodeImplTest.java b/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/BlankNodeImplTest.java
index aa2359a..61a32b1 100644
--- a/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/BlankNodeImplTest.java
+++ b/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/BlankNodeImplTest.java
@@ -28,7 +28,7 @@
 public class BlankNodeImplTest extends AbstractBlankNodeTest {
 
     // Fixed salt just for this test
-    private static UUID SALT = UUID.fromString("35019b59-18b3-4e74-8707-ec55f62a37d6");
+    private static final UUID SALT = UUID.fromString("35019b59-18b3-4e74-8707-ec55f62a37d6");
 
     @Override
     protected BlankNode getBlankNode() {
diff --git a/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/TestWritingGraph.java b/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/TestWritingGraph.java
index 4f28af7..9c40f1c 100644
--- a/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/TestWritingGraph.java
+++ b/commons-rdf-simple/src/test/java/org/apache/commons/rdf/simple/TestWritingGraph.java
@@ -49,7 +49,7 @@
     /**
      * Run tests with -Dkeepfiles=true to inspect /tmp files *
      */
-    private static boolean KEEP_FILES = Boolean.getBoolean("keepfiles");
+    private static final boolean KEEP_FILES = Boolean.getBoolean("keepfiles");
 
     private static Graph graph;
 
