我想创建一个静态类,它的作用类似于枚举,但是带有字符串值。 以下哪种方法最安全地提取已创建类的完整实例?
public class Name
{
public static final Name MY_NAME = new Name("Chris", "Doe");
public String firstName;
public String lastName;
public Name(firstname, lastname)
{
this.firstName = firstname;
this.lastName = lastname;
}
}
OR
public class Name
{
public String firstName;
public String lastName;
public Name(firstname, lastname)
{
this.firstName = firstname;
this.lastName = lastname;
}
public static Name myName()
{
return new Name("Chris", "Doe");
}
}
答案 0 :(得分:6)
最安全?我不确定你的意思。
就最佳实践而言,第二种可能是浪费,因为每次调用Name
时它都会分配myName()
的新实例。另一个使用常量,因此可以节省更多内存。
在一个小应用程序中,所有这些都是相对微不足道的。
如果您试图让您的班级模拟enum
,那么常量肯定是要走的路,因为enum
的值只会被初始化一次。
万一你不知道enum
实际上是什么,这里将是你的班级的示例实现:
public enum Name {
MY_NAME ("Chris", "Doe");
private final String firstName;
private final String lastName;
private Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
...然后您可以简单地引用Name.MY_NAME
。
答案 1 :(得分:0)
我想使用第一个,因为第一个包含static final Name MY_NAME
而在第二种情况下包含 new Name
实例每次调用 myName() method
时都会返回,从而导致内存浪费。所以,最好选择第一个。
因此,要提取已创建类的完整实例,您应该使用第一个实例。
另外,谈论enum
----你持有恒定值,你的static field final Name MY_NAME
实例将达到目的,你应该坚持第一个声明----从而支持你需要枚举以及不浪费记忆!
答案 2 :(得分:0)
追求第一种方法,
创建你的public static
类实例,使你的类最终无法扩展,并使构造函数成为私有,所以它不能在你的类之外实例化
第二种方法的缺陷是,你的静态方法myName
每次创建一个新的Name实例,这是不必要的
答案 3 :(得分:0)
如果您只需要一个具有固定值的对象实例,为什么还要使用成员变量呢? 无论您如何使用该对象,这种方式都是线程安全的。
public class Name
{
public String getFirstName() {
return "Chris"
}
public String getFirstName() {
return "Doe"
}
}
如果你必须有成员变量,那么:
public class Name
{
public final String firstName = "Chris"
public final String lastName = "Doe"
}
但正如其他人建议只使用枚举:
public enum Name {
me("Chris", "Doe");
private String firstName;
private String lastName;
Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}