Intern PackageIdentifiers as a memory optimization.

--
MOS_MIGRATED_REVID=104403040
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
index 65f4258..991544c 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
@@ -20,6 +20,8 @@
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
 import com.google.devtools.build.lib.util.StringCanonicalizer;
 import com.google.devtools.build.lib.util.StringUtilities;
 import com.google.devtools.build.lib.vfs.Canonicalizer;
@@ -45,6 +47,17 @@
 @Immutable
 public final class PackageIdentifier implements Comparable<PackageIdentifier>, Serializable {
 
+  private static final Interner<PackageIdentifier> INTERNER = Interners.newStrongInterner();
+
+  public static PackageIdentifier create(String repository, PathFragment pkgName)
+      throws LabelSyntaxException {
+    return create(RepositoryName.create(repository), pkgName);
+  }
+
+  public static PackageIdentifier create(RepositoryName repository, PathFragment pkgName) {
+    return INTERNER.intern(new PackageIdentifier(repository, pkgName));
+  }
+
   /**
    * A human-readable name for the repository.
    */
@@ -281,7 +294,7 @@
 
   public static PackageIdentifier createInDefaultRepo(PathFragment name) {
     try {
-      return new PackageIdentifier(DEFAULT_REPOSITORY, name);
+      return create(DEFAULT_REPOSITORY, name);
     } catch (LabelSyntaxException e) {
       throw new IllegalArgumentException("could not create package identifier for " + name
           + ": " + e.getMessage());
@@ -297,11 +310,7 @@
   /** The name of the package. Canonical (i.e. x.equals(y) <=> x==y). */
   private final PathFragment pkgName;
 
-  public PackageIdentifier(String repository, PathFragment pkgName) throws LabelSyntaxException {
-    this(RepositoryName.create(repository), pkgName);
-  }
-
-  public PackageIdentifier(RepositoryName repository, PathFragment pkgName) {
+  private PackageIdentifier(RepositoryName repository, PathFragment pkgName) {
     Preconditions.checkNotNull(repository);
     Preconditions.checkNotNull(pkgName);
     this.repository = repository;
@@ -335,7 +344,7 @@
       throw new LabelSyntaxException(error);
     }
 
-    return new PackageIdentifier(repo, new PathFragment(packageName));
+    return create(repo, new PathFragment(packageName));
   }
 
   public RepositoryName getRepository() {