我想在Java中使用构造函数链.例如,对于第一个构造函数,我有一个字符串作为参数,并在我从参数字符串创建一个对象时调用第二个构造函数.
public class IMethodFinder {
public IMethodFinder(String projectName, String methodName,
int numberOfParameters) {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
IJavaProject javaProject = JavaCore.create(project);
this(javaProject, methodName, numberOfParameters);
}
public IMethodFinder(IJavaProject javaProject, String methodName,
int numberOfParameters) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误"构造函数调用必须是构造函数中的第一个语句"错误.

我制作了一个在两个构造函数之间共享的公共代码,但我不确定这是绕过该问题的唯一解决方案.
public class IMethodFinder {
public IMethodFinder(IJavaProject javaProject, String methodName,
int numberOfParameters) {
dosomething(javaProject, methodName, numberOfParameters);
}
public IMethodFinder(String projectName, String methodName,
int numberOfParameters) {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
IJavaProject javaProject = JavaCore.create(project);
dosomething(javaProject, methodName, numberOfParameters);
}
private void dosomething(IJavaProject javaProject, String methodName,
int numberOfParameters)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*ine 15
Java无法扩展为允许this在构造函数之前不访问的语句.但是,这会增加语言的复杂性并在使用时模糊代码(特别是当您认为调用可能是隐含的时).
通常,您希望保持构造函数尽可能简单.init()方法是一个坏主意,因为它们阻止使用final.似乎代码正在访问一个可变静态,这是一个非常糟糕的主意.
对于您的特定代码,您可以写:
public IMethodFinder(String projectName, String methodName,
int numberOfParameters) {
this(
JavaCore.create(
ResourcesPlugin.getWorkspace().getRoot().getProject(projectName)
),
methodName,
numberOfParameters
);
}
Run Code Online (Sandbox Code Playgroud)
更普遍的hack是在对构造函数的调用中调用静态方法:
public class IMethodFinder {
public IMethodFinder(String projectName, String methodName,
int numberOfParameters) {
this(createProject(projectName), methodName, numberOfParameters);
}
public IMethodFinder(IJavaProject javaProject, String methodName,
int numberOfParameters) {
...
}
private static IJavaProject createProject(String projectName) {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
IJavaProject javaProject = JavaCore.create(project);
return javaProject;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2018年3月:在消息记录中:构造和验证 Oracle建议删除此限制(但与C#不同,在构造函数链接之前肯定this会取消分配(DU)).
从历史上看,this()或super()必须首先在构造函数中.这种限制从未受到欢迎,并被认为是武断的.有许多微妙的原因,包括验证特殊参与,导致了这种限制.多年来,我们已经在虚拟机层面解决了这些问题,以至于考虑解除这一限制变得切实可行,不仅仅是记录,而是所有构造函数.
| 归档时间: |
|
| 查看次数: |
27937 次 |
| 最近记录: |