假设我有一个班级,而且我只做了一个实例而且我不需要更多。
我应该让这个类静态吗? (不是类本身,而是函数和变量)。
在下面的例子中,如果我不会生成多个实例,我应该将该类设为静态吗?
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.
}
答案 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(....)
{
....
}
}