在 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 + "'}";
}
}
我在 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 + "'}";
}
}