我应该让一个静态的课吗?

时间:2018-04-09 09:01:33

标签: java oop

我有以下课程:

class A
{
    private String state;

    A() { state = staticGetterCall(); } // staticGetterCall is fast

    bool shouldUseState() { return state != null; }

    bool getState() { return state; }
}

然后我在其他构造函数中以下列方式使用class A

B(...) {
    ...
    A a = new A();
    if (a.shouldUseState())
    {
        staticFunction2Call(a.getState());
    }
}

这是我使用A的唯一地方,所以我认为重构这个并使这两个方法成为静态(并内联String state)是个好主意:< / p>

class A
{
    bool shouldUseState() { return staticGetterCall != null; }

    bool getState() { return staticGetterCall; } 
}

所以它的用法转换为:

B(...) {
    ...
    if (A.shouldUseState())
    {
        staticFunction2Call(A.getState());
    }
}

有意义吗?

3 个答案:

答案 0 :(得分:1)

  

我应该让一个类静态吗?

要回答您的问题,您需要了解此用法的优点和缺点。

根据Joshua BlochEffective Java 2Edition第1项,让我列出他对构造函数的静态使用优缺点的观点。所以你可以有效地决定你的计划。

<强>优点:
1.静态工厂方法的一个优点是,与构造函数不同,它们具有名称。

2.静态工厂方法的第二个优点是,与构造函数不同,它们在每次调用时都不需要创建新对象。

3.静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。

静态工厂方法的第四个优点是它们减少了创建参数化类型实例的冗长程度。

<强>缺点
1.仅提供静态工厂方法的主要缺点是没有公共或受保护构造函数的类不能被子类化。

2.静态工厂方法的第二个缺点是它们不容易与其他静态方法区分开来。

简而言之,静态工厂方法和公共建设者都有其用途,了解它们的相对优点是值得的。 通常静态工厂是优选的,因此在没有首先考虑静态工厂的情况下,避免反射提供公共构造者。

答案 1 :(得分:0)

  

这是我使用A的唯一地方,所以我认为重构是个好主意   这个并使这两个方法静态(并内联String状态):

将实例方法设为静态并不是理由 static成员(方法或字段)不是特定于类的实例,而是与类本身相关联 如果将这些方法定义为static,则必须进行一些其他更改:state字段也应该是static,构造函数也不再有任何意义,因为静态方法不会无法访问实例成员。

将整个班级的状态和行为定为static是否真的有意义? 如果状态取决于创建的A实例,请将它们保留为实例成员 除了一般的方式,因为你在课堂上有一个州,所有static似乎都是反直觉的 最后,static修饰符不会简化到其他实现的切换(因此也会在单元测试中进行模拟)。因此,您应该先考虑这一点,然后再制作static

答案 2 :(得分:0)

以下代码对我有意义

class A {

    private static Boolean state;

    A() {
        state = staticGetterCall();
    } // staticGetterCall is fast

    private boolean staticGetterCall() {
        return true;
    }

    static boolean shouldUseState() {
        return state != null;
    }

    static boolean getState() {
        return state;
    }
}

class B {
    B() {
        A a = new A();
        if (A.shouldUseState()) {
            staticFunction2Call(a.getState());
        }
    }

    private void staticFunction2Call(boolean state) {
    }
}

您的代码中几乎不需要进行任何更改。这些都是微不足道的,我想你知道这些 1.将状态字段声明为静态 2.将state的数据类型更改为Boolean。现在它被声明为String。