Java中哪种方式更好?

时间:2014-06-09 14:24:36

标签: java class design-patterns static static-methods

我想创建一个静态类,它的作用类似于枚举,但是带有字符串值。 以下哪种方法最安全地提取已创建类的完整实例?

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

4 个答案:

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