反射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();
}
}
预期输出(未经测试):
好!
使用反射是一种代码异味,特别是如果您正在编写的背后的意图不能保证它。
没有看到代码很难说更多,因为它只是猜测。
我想:
枚举后面为什么要摆在首位
确定
static
修改,其实是摆在首位的正确决定有那些static
成员的原因:即这些应该是实例还是类成员?这些课程的“客户”如何使用它们?我使用什么样的范例?功能或面向对象的代码。它是否满足DRY,SOLID和KISS编程实践?考虑,如果我过工程放在首位
更重要的是:
- 我将通过测试第一,驱动的设计,设计我的代码你通过用户的眼睛获取API,以及在实施前已经测试过的额外好处。通常,当以这种方式编写代码时,我排除了这样的问题,因为从用户的角度而不是设计者的角度来看,解决方案更为明显。它成为一种实用主义问题,而不是满足建筑设计目标和理念。
我不确定你是否正在设计第一点。我觉得'静态'被过度使用的OP,但我承认这是很难说没有例子 –
如何证明设计决策是过度工程? –
对不起,如果我的评论是模棱两可的。我的意思是我几乎可以肯定,这不是过度工程。我只是提到你的第三点。我完全同意你的答案的确如此。 –
这不是一个如何进行调用(直接与反射),而是关于将方法*本身*改为非静态的问题。如果您只是将直接调用更改为反射调用,但将该方法保留为静态方法,那么您只是让代码*变得更糟!! * – Andreas
您究竟意味着什么“从该方法中检索值” ?获取它返回的价值?也许你应该给一些代码示例。 –
@Andreas是的,我正在谈论将方法更改为非静态方法,并通过Reflection访问它 –