反射VS静态东西

反射VS静态东西

问题描述:

最近我已经重组了一个Java代码,试图尽可能地消除static东西(变量和方法),并用更好的编码实践取而代之。反射VS静态东西

我也开始学习思考,发现它可以让我做一些事情说,起初,我只能实现(或者,至少,这就是我看到它)与static电话或引用。

然而,虽然我一直在阅读,但不推荐使用static,它似乎与反思不一样。

所以,我问:不是的制作方法static,并要求它像ClassName.methodName(),它是一个合法的使用反射使它成为一个实例方法,并通过调用java.lang.reflect.Method.invoke()它?


像动态访问类的内容


下面是一个代码示例:

假设性的情况,工程(但我不想使该方法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

这不是一个如何进行调用(直接与反射),而是关于将方法*本身*改为非静态的问题。如果您只是将直接调用更改为反射调用,但将该方法保留为静态方法,那么您只是让代码*变得更糟!! * – Andreas

+1

您究竟意味着什么“从该方法中检索值” ?获取它返回的价值?也许你应该给一些代码示例。 –

+0

@Andreas是的,我正在谈论将方法更改为非静态方法,并通过Reflection访问它 –

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

没有看到代码很难说更多,因为它只是猜测。

我想:

  • 枚举后面为什么要摆在首位

  • 确定static修改,其实是摆在首位的正确决定有那些static成员的原因:即这些应该是实例还是类成员?这些课程的“客户”如何使用它们?我使用什么样的范例?功能或面向对象的代码。它是否满足DRY,SOLID和KISS编程实践?

  • 考虑,如果我过工程放在首位

更重要的是:

  • 我将通过测试第一,驱动的设计,设计我的代码你通过用户的眼睛获取API,以及在实施前已经测试过的额外好处。通常,当以这种方式编写代码时,我排除了这样的问题,因为从用户的角度而不是设计者的角度来看,解决方案更为明显。它成为一种实用主义问题,而不是满足建筑设计目标和理念。
+0

我不确定你是否正在设计第一点。我觉得'静态'被过度使用的OP,但我承认这是很难说没有例子 –

+0

如何证明设计决策是过度工程? –

+0

对不起,如果我的评论是模棱两可的。我的意思是我几乎可以肯定,这不是过度工程。我只是提到你的第三点。我完全同意你的答案的确如此。 –