Java - 使类静态而不是它的一个实例

时间:2014-02-03 18:14:25

标签: java

假设我有一个班级,而且我只做了一个实例而且我不需要更多。
我应该让这个类静态吗? (不是类本身,而是函数和变量)。

在下面的例子中,如果我不会生成多个实例,我应该将该类设为静态吗?

public class Foo {
    int num1;
    int num2;

    public void func() {
        // Something in here
    }
}

public static void main(String[] args) {
    Foo bar = new Foo(); //I don't need more than one instance of that class.
}

7 个答案:

答案 0 :(得分:2)

您可以使用enum来定义单身人士。

public enum Foo {
    INSTANCE;

    int num1;
    int num2;

    public void func() {
        // Something in here
    }
}

public static void main(String[] args) {
    Foo bar = Foo.INSTANCE;
}

但是,只有在您要强制实施一个实例时才需要这样做。否则,我只会使用new Foo();并仅调用一次,如果您只需要一次。

答案 1 :(得分:2)

  • 如果你的班级没有州,请说:

    class NoState {
        static int sum(int i1, int i2) { return i1 + i2; }
    }
    

    然后使用静态方法是有意义的。

  • 如果您必须确保您的课程只有一个实例,那么您可以使用单身,但要小心:global state can be evil

  • 没有单身人士那么糟糕,你可以使用静态字段/方法:它在某些情况下很有用,但不应该被滥用。

  • 在任何其他情况下(=大部分时间),只需使用普通的实例变量/方法。

答案 2 :(得分:1)

您可以使用Singleton。但是,请确保Singleton是否真正需要 - 有时单例会过度使用静态方法的简单类可能就足够了。创建单例的方法有很多,如What is an efficient way to implement a singleton pattern in Java?

所述

请注意,使用Java 5时,枚举是创建单例的首选方法。

答案 3 :(得分:1)

你说我不需要更多,所以我的答案是不要多于一个,如果你真的想强制实例它应该只有一个类,那么使用枚举最好的方法来实现java中的单身人士

例如在数据源中,一个人确实需要单身

public enum UserActivity {
    INSTANCE;

    private DataSource dataSource;
    private JdbcTemplate jdbcTemplate;

    private UserActivity() {
        this.dataSource = MysqlDb.getInstance().getDataSource();
        this.jdbcTemplate = new JdbcTemplate(this.dataSource);
    }

    public void dostuff() {
     ...
    }
}

如果你真的需要那么就使用它,否则就用你当前的逻辑

答案 4 :(得分:0)

必须实例化一次且仅一次的类称为 singleton 。这些知识可以帮助您缩小搜索范围。为了让您有个先机:

答案 5 :(得分:0)

基本上,静态方法和字段意味着您不需要该类的任何实例。

在你的情况下,你需要' singleton'在类中,您可以使用枚举,也可以使用特定的规则集自己制作单身。

答案 6 :(得分:0)

这实际上取决于您的申请范围。如果您希望将此对象用作单例,您将提供一个静态方法来获取该类的唯一实例。

public class Foo
{

     private static Foo instance ....
     private Foo()
     { 
         ..... 
      }

      public static Foo getInstance()
      {
         return instance;
      }

}

如果您打算使用像spring这样的框架,您只需将一个对象添加到应用程序上下文中。

<bean class="....Foo" id="fooInstance" scope="singleton">
  ....
</bean>

但也许,你可以折射这个类只保留静态方法。然后,您可以将该类标记为final,并提供私有构造函数。

public final class Utils
{
     private Utils(){}

     public static .... doFoo(....)
     {
           ....
     }
}