所以我建立了一个主要用于个人用途的测试库,但我有一个问题。
使用Java,如果你的班级中有2个或更多的构造函数,如果你想从另一个构建函数,那么它必须是你做的第一件事。这对我来说是个问题,因为我有以下设置。
public Constructor(TypeA a, TypeB b, TypeC c) {
if (c.getData() == null) throw new IllegalArgumentException("");
this(a, b, c.getOtherData());
}
public Constructor(TypeA a, TypeB b, TypeD d) {
// stuff happens
}
如何做到这一点,避免使用"构造函数调用必须是构造函数中的第一个语句"错误?
答案 0 :(得分:4)
你无法用构造函数做你想做的事。而是使用这样的静态工厂方法:
struct tm tm;
tm.tm_year = 2000 - 1900; // Years from 1900
tm.tm_mon = 1 - 1; // Months form January
tm.tm_mday = 1;
char time_buffer[100];
int hh, mm;
float ss;
time_t time_value;
char *timestamp = "16:11:56.484";
if (sscanf(timestamp, "%d:%d:%f", &hh, &mm,&ss) != 3) Handle_BadData();
tm.tm_hour = hh;
tm.tm_min = mm;
tm.tm_sec = roundf(ss); // or simply = ss;
tm.tm_isdst = 0; // Keep in standard time
// time_value = malloc(100*sizeof(char));
time_value = mktime(&tm);
if (time_value == -1) {
printf ("unable to make time");
}
else {
strftime(time_buffer, sizeof(time_buffer), "%c", &tm);
printf(time_buffer);
}
// Sat Jan 1 16:11:56 2000
答案 1 :(得分:3)
一个选项(可能不好):
检查getData == null and throw the exception as first thing in
c.getOtherData()`。这将是第一个被执行的方法。
其他选项: 有一个方法,
helper() {
if (getData() == null) throw new Exception();
return getOtherData();
}
从构造函数中调用c.helper()
而不是c.getOtherData()
答案 2 :(得分:2)
如何创建静态工厂方法?
public static Constructor newInstance(TypeA a, TypeB b, TypeC c) {
if (c.getData() == null) throw new IllegalArgumentException("");
return new Constructor(a, b, c);
}
private Constructor(TypeA a, TypeB b, TypeC c) {
this(a, b, c.getOtherData());
}
private Constructor(TypeA a, TypeB b, TypeD d) {
// stuff happens
}
答案 3 :(得分:0)
你可以有一个额外的私人建筑师。我假设你在这里简化了一些代码。你是说如果某些东西是null然后抛出 - 否则你别的东西。
public Constructor(TypeA a, TypeB b, TypeC c) {
this(a, b, c.getData(), c.getOtherData()); //calls the private ctor
}
public Constructor(TypeA a, TypeB b, TypeD d) {
// stuff happens
}
private Constructor(TypeA a, TypeB b, TypeD d1, TypeD d2) {
// stuff happens
}
或者你可以传递TypeC
private Constructor(TypeA a, TypeB b, TypeC) {
// now do you null check here.
}
Java确实会引起一些痛苦!然后这个规则就是其中之一。在关于编译错误的问题的具体答案中 - 你不能:(
答案 4 :(得分:0)
尝试将抛出的异常移动到第二个构造函数的开头。这将实现完全相同的事情。如果该构造函数有多个路径,则可以创建一个指示逻辑路径的附加参数。