Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:静态方法和继承。有办法解决这个问题吗?_Java_Inheritance_Reflection_Static Methods - Fatal编程技术网

java:静态方法和继承。有办法解决这个问题吗?

java:静态方法和继承。有办法解决这个问题吗?,java,inheritance,reflection,static-methods,Java,Inheritance,Reflection,Static Methods,我有以下问题: 有一个引擎调用超类的静态方法(我们称之为SuperClass.StaticMethod)。我无法获得发动机代码,但我可以对此进行反思 我对超类进行了子类化(生成子类),并且能够通过反射编辑从超类继承的私有字段。到目前为止一切正常 引擎有一个类(我们称之为常量),它有许多类的静态最终实例,包括超类,但不是我的子类,因为它不是引擎的一部分 现在,SuperClass.StaticMethod执行以下等效操作: public int StaticMethod(int i) {

我有以下问题:

有一个引擎调用超类的静态方法(我们称之为SuperClass.StaticMethod)。我无法获得发动机代码,但我可以对此进行反思

我对超类进行了子类化(生成子类),并且能够通过反射编辑从超类继承的私有字段。到目前为止一切正常

引擎有一个类(我们称之为常量),它有许多类的静态最终实例,包括超类,但不是我的子类,因为它不是引擎的一部分

现在,SuperClass.StaticMethod执行以下等效操作:

public int StaticMethod(int i)
{
    if(i == 0)
        return Constants.SuperClassInstance.Field_1;
    else if(i == 1)
        return Constants.SuperClassInstance.Field_2;
}
SuperClass.Field_1和SuperClass.Field_2都是私有的(人们认为它们不是静态的,所以我对这个问题进行了一些编辑),但是静态方法可以看到它们,因为它是SuperClass的一个成员。正如我所说的,我能够通过反射在继承的子类上设置这些字段的值,但是由于SupperClass.StaticMethod的工作方式,如上所示,这对它没有影响

我不认为我可以改变SuperClassInstance.Field_1和Field_2,否则我会稍微但理智地改变SuperClass的工作方式


有什么办法解决这个问题吗?

在我看来,这似乎是一个XY问题。这就是你的大部分问题都与设计有关


首先,拥有一个私有静态决赛的目的是什么?既然它是最终的,它也可能是公开的。这是我经常看到的,但我认为这通常是一种不好的做法

使某物静止,本质上使其全球化。在像单例这样的情况下,人们希望隐藏静态变量的全局性。但是,通常会有一些辅助函数显示此“隐藏的全局”的有用功能


听起来父类缺少使父类完全有用的方法。有没有一种方法可以改变父类的设计,而不是利用所有这些黑客来让项目工作?

现在还不清楚为什么要首先破坏访问控制。因为我需要我的类与引擎一起工作。我需要引擎来正确呈现我的子类。我简化了代码,因为这是问题的本质,但这是一个渲染问题。听起来引擎不是按这种方式设计的。让代码违背其设计几乎总是一个坏主意。当您的“更简单的解决方案”涉及到设置带有反射的字段时,因为您没有访问这些字段的权限,因此值得遵循预期的设计。@user2212990问题是您不知道您的黑客可能会破坏什么。如果API希望开发人员注册渲染器,请注册渲染器。内部细节是内部的,可能会更改。不,除非我在运行时使用反射更改引擎类的代码。这将是一个更大的黑客攻击。“既然它是最终的,它也可能是公共的”-不,它可以使用静态方法,而不会乱丢公共名称空间,有很好的理由您可能不希望它是公共的。静态和公共是正交特性。如果您希望用户能够访问隐藏变量或其他什么,那么只有帮助函数,这就是为什么会有不同的访问分类。