反射VS静态东西

时间:2016-08-05 07:05:46

标签: java reflection static

最近,我一直在重构一个Java代码,试图尽可能消除static内容(变量和方法)并用更好的编码实践取而代之。

我也开始研究反思,并注意到它允许我做一些事情 1 ,起初,我只能实现(或者,至少,我是如何看待它的) )static电话或参考。

然而,虽然我一直在阅读,但并不建议使用static,但反射似乎并不相同。

所以,我问:不是制作方法static并将其称为ClassName.methodName(),而是将它作为一种实例方法并通过{{java.lang.reflect.Method.invoke()调用它。 1}}?

1 喜欢动态访问一个班级'含量

这是一个代码示例:

有效的假设情况(但我不想制作方法static):

import static java.lang.System.out;


public class Foo
{
    private static boolean light;


    public Foo()
    {
        turnOn();
    }

    public static void turnOn()
    {
        light = true;
    }

    public static void turnOff()
    {
        light = false;
    }

    public static boolean isGreenLight()
    {
        return light;
    }
}

public class Boo
{
    public Boo()
    {
        if (Foo.isGreenLight())        // I need to access Foo.isGreenLight() from here, but cur-
        {                              // rently that method is not static (it should be to do so)
            out.println("Ok!");
        }
    }
}

public final class Main
{
    public static void main(String[] args)
    {
        final Boo boo = new Boo();
    }
}

也应该有效的假设情况(它如何使用反射):

import static java.lang.System.out;
import java.lang.reflect.Method;


public class Foo
{
    private boolean light;


    public Foo()
    {
        turnOn();
    }

    public void turnOn()
    {
        this.light = true;
    }

    public void turnOff()
    {
        this.light = false;
    }

    public boolean isGreenLight()
    {
        return this.light;
    }
}

public class Boo
{
    public Boo()
    {
        if ((boolean) Class.forName("Foo").getMethod("isGreenLight", null).invoke(new Foo(), null))
        {
            out.println("Ok!");
        }
    }
}

public final class Main
{
    public static void main(String[] args)
    {
        final Boo boo = new Boo();
    }
}

预期输出(未经测试):

  

确定!

1 个答案:

答案 0 :(得分:4)

使用反射是一种代码气味,特别是如果您正在撰写的内容背后的意图并不能保证它。

如果不看代码就很难说更多,因为它只是猜测。

我会:

  • 列举了您首先拥有static成员的原因

  • 首先确定static修饰符是否实际上是正确的决定:即这些是实例还是类成员?它们如何被"客户"有问题的课程?我使用的范例是什么?功能或面向对象的代码。它是否满足DRY,SOLID和KISS编程实践?

  • 考虑我是否首先过度工程

更重要的是:

  • 我会通过测试第一次设计我的代码,这会通过用户的眼睛推动您的API设计,并且在您实施之前还有额外的好处,即您拥有测试覆盖率。通常,当我以这种方式编写代码时,我会消除这些问题,因为从用户而不是设计师的角度来看,解决方案更加明显。它成为一个实用主义的问题,而不是满足建筑设计目标和哲学。