gpt4 book ai didi

java构造函数重载this(),如何在this()之前执行代码

转载 作者:行者123 更新时间:2023-12-01 06:40:57 27 4
gpt4 key购买 nike

今天我在一个巨大的项目中遇到了一个有趣的情况。一个类有多个构造函数,它们通过this()相互调用,最后会调用init()、build()等。我想设置一个标志,然后调用 this() 和整个繁琐的过程,但调用 this() 应该是第一个。

如何修改此类中的代码,而不修改构造函数 header 并设置标志? :)

我知道这听起来很老套,也许这不是在学校学到的,这就是为什么至少对我来说很有趣。对于其他人来说,在某些情况下也很有用。

这是一个基本示例,我做了一些修改来模拟实际问题,即 init() 方法。 http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

public class Rectangle {
private int x, y;
private int width, height;
private boolean flag;

public Rectangle() {
// execute code here, before this(), how? -set the flag true for eg.
this(0, 0, 0, 0);
}
public Rectangle(int width, int height) {
// execute code here to, something different as above, before this(), how?
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
init();
}
private void init(){
if(flag){
... do something new, else or different as the original, maybe return, even exit too
}

... do something... the old code
}
}

我得到了 1 个简单的实现,但在我写下这个问题之前,我也得到了第二个。

我的重要问题尚未得到解答,但我希望这会得到解答,并且我可以接受想要建立声誉的人的答案。

不能对 init() 方法进行两次编码,也不能将代码逻辑写在两处,因为它不是一个好的编程范例,并且可能会调用几百万行代码。

-------------编辑添加----------------

There is a way to known from which constructor was called: the full parametrized one or anything else with this() -I hope it gives more idea:

public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;

try {
throw new RuntimeException("Hacking use a lot of imagination");
} catch (Exception ex) {
StackTraceElement[] stackTraces = ex.getStackTrace();
// the first element is just above, no reason to check
String thisClassName = getClass().getName();

if (stackTraces[1].getClassName().equals(thisClassName)) {
if (stackTraces[1].getMethodName().equals("<init>")) {
flag = true;
}
}
}

init();
}

private void init() {
if (flag) {
System.out.println("\"... do something new, else or different as the original, maybe return, even exit too\"");
}

System.out.println("\"... do something... the old code");

}

------------------------ 编辑添加解决方案 1 - 一个非常简单的案例

    public Rectangle() {
// execute code here, before this(), how? -set the flag true for eg.
this(doVeryBanalHack(0, false), 0, 0, 0);
}

public Rectangle(int width, int height) {
// execute code here to, something different as above, before this(), how?
this(doVeryBanalHack(0, false), 0, width, height);
}

public Rectangle(int x, int y, int width, int height) {
this.x = doVeryBanalHack(x, true);
this.y = y;
this.width = width;
this.height = height;
// TODO deal with concurrency if you are in multithreaded environment, otherwise is done
this.flag = nextValueOfFlag;
init();
....}

private static boolean nextValueOfFlag;

private static int doVeryBanalHack(int retValue, boolean flagValue) {
System.out.println("\"execute code here, before this() it is too simple, it is banal static function\");
// TODO deal with concurrency if you are in multithreaded environment
nextValueOfFlag = flagValue;
}

在一个巨大的项目中无法更改函数签名的原因是(其中之一)动态加载和反射使用:http://tutorials.jenkov.com/java-reflection/constructors.htmlhttp://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html

http://www.java-forums.org/java-lang/7896-object-reflection-invoking-constructor-parameters.html如果您有源代码,某些 IDE 足够智能,即使使用 Class.forName("java.awt.Rectangle") 也能找到对该类的引用,但如果它们位于第三方库(插件)中,则可能不会。一个许可证检查例程想要隐藏自己,而经验丰富的开发人员会将“矩形”拆分为“矩形”+“标签”,甚至更复杂(decodeString)(但这已经足够了。高度怀疑你的 super 智能编辑器可以找到引用文献比:)

下一个解决方案可以是反射(这是我在这里输入并在上面写的第二个解决方案)-还没人提到

最佳答案

一句话:你不能。 Java 禁止在 this 之前调用任何内容,所以放弃这个想法。

that invokes maybe a few millions line of the code.

这本身就是一个问题。如果我是你,我会非常担心。

对我来说,这听起来不太像构造函数,而更像是构建器模式。也许您应该考虑构造函数的替代方案。

您需要一个设置该标志的构造函数,即使它是私有(private)的。

public class Rectangle {
private int x, y;
private int width, height;
private boolean flag;

private Rectangle(int x, int y, int w, int h, boolean doInit) {
this.x = y;
this.y = y;
this.width = w;
this.height = h;
this.flag = doInit;
// Do what you must after this; adjust other ctors accordingly.
}
}

我也会考虑重构其余部分。数百万行代码?哦,我的天。

关于java构造函数重载this(),如何在this()之前执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9709525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com