最近,我一直在重构一个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();
}
}
预期输出(未经测试):
确定!
答案 0 :(得分:4)
使用反射是一种代码气味,特别是如果您正在撰写的内容背后的意图并不能保证它。
如果不看代码就很难说更多,因为它只是猜测。
我会:
列举了您首先拥有static
成员的原因
首先确定static
修饰符是否实际上是正确的决定:即这些是实例还是类成员?它们如何被"客户"有问题的课程?我使用的范例是什么?功能或面向对象的代码。它是否满足DRY,SOLID和KISS编程实践?
考虑我是否首先过度工程
更重要的是: