Java 生成自身实例的静态类

Java 生成自身实例的静态类,java,Java,在静态方法中实例化自身的实例,然后使用该对象而不是静态地执行所有操作,其缺点是什么 假设我有一门课是这样的: public class MyClass { private String foo; private String bar; private MyClass(String foo, String bar) { this.foo = foo; this.bar = bar; } public static Stri

在静态方法中实例化自身的实例,然后使用该对象而不是静态地执行所有操作,其缺点是什么

假设我有一门课是这样的:

public class MyClass {
    private String foo;
    private String bar;

    private MyClass(String foo, String bar) {
        this.foo = foo;
        this.bar = bar;
    }

    public static String concat(String foo, String bar) {
        MyClass myClass = new MyClass(foo, bar);
        return myClass.concatStrings();
    }

    private String concatStrings() {
        return foo + bar;
    }
}
public class MyStaticClass {
    public static String concat(String foo, String bar) {
        return foo + bar;
    }
}
这种模式的好处是,我不必将输入参数传递给各种私有方法。我能想到的唯一一件坏事是,创建一个我并不真正需要的对象可能会导致性能问题。但在这个非常简单的示例中,我只注意到(在快速junit测试中)大量迭代(即>=10^8)与下面这样的简单静态类的真正区别:

public class MyClass {
    private String foo;
    private String bar;

    private MyClass(String foo, String bar) {
        this.foo = foo;
        this.bar = bar;
    }

    public static String concat(String foo, String bar) {
        MyClass myClass = new MyClass(foo, bar);
        return myClass.concatStrings();
    }

    private String concatStrings() {
        return foo + bar;
    }
}
public class MyStaticClass {
    public static String concat(String foo, String bar) {
        return foo + bar;
    }
}

还有其他支持或反对这种模式的论据吗?

我认为这里的问题是静态本身的使用(是,有一些和它的)。大多数情况下,这个带有静态方法的实用程序可以被其他方法替代。因此,我的建议是:

public class MyClass {
    private String foo;
    private String bar;

    MyClass(String foo, String bar) {
        this.foo = foo;
        this.bar = bar;
    }

    public String concatFooBar() {
        return new Concat(foo, bar).getResult();
    }

}
和实用程序类:

public final class Concat {
    private String foo;
    private String bar;

    Concat(String foo, String bar) {
        this.foo = foo;
        this.bar = bar;
    }

    String getResult() {
        return foo + bar;
    }

}

如果您的静态实用程序方法需要重构为一个类,那么就这样做,没有缺点。根据上下文的不同,在单独的类或同一个类中执行此操作可能更有意义。@Oleg说这是一个全新的实用程序类,而不是一些重构。好处是,我不必在内部传递参数。首先,您不应该使用singelton模式:,而且不,没有规则规定“服务方法”必须(也不应该)是
静态的
…从调用方的角度来看,这并不重要。避免
静态访问
除非你有很好的理由…你将参数传递到构造函数中,而不是直接传递到私有方法中,所以我不确定你在哪里看到了优势。