2014-06-09 28 views
1

我想创建一个类似于枚举的静态类,但是使用字符串值。 以下哪一种方法最安全地提取创建的类的完整实例?以下哪种方法在Java中更好?

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

在第二图案为什么您使用硬编码值? – Braj

+0

两者并不完全相同;第二个会在每次调用myName()时返回一个新的'Name'实例,而第一个将返回相同的实例(禁止序列化/并发shenanigans) – awksp

+0

第一个将是一个更好的选择,因为您正在创建字符串的最终字段。 –

回答

0

我想一起去的第一个,因为第一个在new Name实例将返回每次你打电话导致内存浪费的myName() method第二种情况下的static final Name MY_NAME包括。所以,最好和第一个一起去。

因此,要提取创建类的完整实例,你应该第一个去。

此外,在谈论enum ----其中您持有恒定值,您的static field final Name MY_NAME实例将用于此目的,您应该坚持第一次声明----从而支持您需要枚举以及不浪费记忆!

6

最安全?我不确定你的意思。

就最佳实践而言,第二个可能是浪费,因为每次调用myName()时,它将分配一个新实例Name。另一个使用常量,所以它保存了更多的内存。

所有这一切都在一个小应用程序比较琐碎。

如果您尝试让您的课程模拟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

这在某种程度上引发了“为什么不首先使用枚举”这个问题,特别是当你对这些值进行硬编码时。即使枚举可能会以某种方式动态地发生。 – Rogue

+0

@盗贼我同意你可能只是使用'枚举',但我不认为这是一个合适的答案,哈哈。 – asteri

+0

@ JeffGohlke-使用'enum'演示的很好的解释。 –

0

进去后第一个方法,

创建类的你public static情况下,让你的级决赛中,因此不能进行扩展,使构造私人,所以它不能被实例化类

缺陷与外第二种方法是,你的静态方法myName每次创建一个不需要的名称的新实例

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; 
    } 
}