在 java 中创建 class 名称生成器

Creating class name generator in java

我在 java 中自动命名变量时遇到了很多问题。

问题所在:

我提出了一个 class 观点(与 java.awt.Point 不同)。它有一个属性 this.name。从 testPoint.java 我只是创建一个 Point 并打印它的名字。

要创建一个点,我有两个链接的构造函数:

public Point() {
        this("AutoName");
    }

public Point(String name) {
        this.name = name;
    }

如果在testPoint.java中给出了一个名称,该点将根据该名称命名。如果没有给出名称,点将被命名为 AutoName.

我想要的是,如果没有给出名称,第一个没有命名的点将 AutoName1 作为名称,第二个 AutoName2

有没有办法在不引入新的 classes 的情况下做到这一点?如果我可以像在 C 和 Python 中那样在 java 中创建一个全局变量会很容易,但我认为这不符合封装原则...

在class中使用一个static int来保存实例数


class Point {
    static int creationCount = 1;
    String name;

    public Point() {
        this("AutoName" + (creationCount++));
    }

    public Point(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Point{name='" + name + "'}";
    }
}
System.out.println(new Point());       // Point{name='AutoName1'}
System.out.println(new Point("abc"));  // Point{name='abc'}
System.out.println(new Point());       // Point{name='AutoName2'}
System.out.println(new Point("bcd"));  // Point{name='bcd'}

您可以使用静态变量来做到这一点:

class Point {
  static int counter = 1;
  String name;
  
  public Point() {
    this("AutoName" + counter);
    counter++;
  }

  public Point(String name) {
    this.name = name
  }
}

适用于单线程应用程序,例如当有一个循环创建点时。

但是,如果有多个线程创建 Point class 的实例,creationCount 的值可能会针对不同的点重复,并将计数器变量定义为 static volatile 不保证其值的唯一性,因为前增量和 post 增量不是原子操作。

因此,在一般情况下,为了上述目的使用更多线程安全的 AtomicInteger 可能更好:

import java.util.concurrent.atomic.AtomicInteger;

class Point {
    static AtomicInteger creationCount = new AtomicInteger(1);
    String name;

    public Point() {
        this("AutoName" + creationCount.getAndIncrement());
    }

    public Point(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Point{name='" + name + "'}";
    }
}