我可以在这里做什么来检测两种方法中的重复项
What can i doing here to detect the duplicate in the two methods
两种方法intValueOf
和intValueOfOptional
,非常相似。
我想修改实现,使这两种方法使用尽可能少的重复代码。
这两种方法都包含一个非常复杂的条件。我怎样才能简化它们,
条件的语义相关部分转换为具有有意义名称的变量?
为此我应该使用 IntelliJ 的哪些重构?
public static int intValueOf(String str) {
int idx = 0;
int end;
boolean sign = false;
char ch;
if ((str == null) || ((end = str.length()) == 0) || ((((ch = str.charAt(0)) < '0') || (ch > '9')) && (!(sign = ch == '-') || (++idx == end) || ((ch = str.charAt(idx)) < '0') || (ch > '9')))) {
throw new NumberFormatException(str);
}
int ival = 0;
for (; ; ival *= 10) {
ival += '0' - ch;
if (++idx == end) {
return sign ? ival : -ival ;
}
if (((ch = str.charAt(idx)) < '0') || (ch > '9')) {
throw new NumberFormatException(str);
}
}
}
public static Optional<Integer> intValueOfOptional(String str) {
int idx = 0;
int end;
boolean sign = false;
char ch;
if ((str == null) || ((end = str.length()) == 0) || ((((ch = str.charAt(0)) < '0') || (ch > '9')) && (!(sign = ch == '-') || (++idx == end) || ((ch = str.charAt(idx)) < '0') || (ch > '9')))) {
return Optional.empty();
}
int ival = 0;
for (; ; ival *= 10) {
ival += '0' - ch;
if (++idx == end) {
return Optional.of(sign ? ival : -ival);
}
if (((ch = str.charAt(idx)) < '0') || (ch > '9')) {
return Optional.empty();
}
}
}
}
您不需要任何工具,只需查看代码中的区别即可。这是相同的逻辑,尽管当它不是有效的 int
时抛出,而另一个 returns 是空的 Optional
.
只需利用其中一个,例如
public static int intValueOf(String str) {
return intValueOfOptional(str).orElseThrow(() -> new NumberFormatException(str));
}
两种方法intValueOf
和intValueOfOptional
,非常相似。
我想修改实现,使这两种方法使用尽可能少的重复代码。
这两种方法都包含一个非常复杂的条件。我怎样才能简化它们, 条件的语义相关部分转换为具有有意义名称的变量?
为此我应该使用 IntelliJ 的哪些重构?
public static int intValueOf(String str) {
int idx = 0;
int end;
boolean sign = false;
char ch;
if ((str == null) || ((end = str.length()) == 0) || ((((ch = str.charAt(0)) < '0') || (ch > '9')) && (!(sign = ch == '-') || (++idx == end) || ((ch = str.charAt(idx)) < '0') || (ch > '9')))) {
throw new NumberFormatException(str);
}
int ival = 0;
for (; ; ival *= 10) {
ival += '0' - ch;
if (++idx == end) {
return sign ? ival : -ival ;
}
if (((ch = str.charAt(idx)) < '0') || (ch > '9')) {
throw new NumberFormatException(str);
}
}
}
public static Optional<Integer> intValueOfOptional(String str) {
int idx = 0;
int end;
boolean sign = false;
char ch;
if ((str == null) || ((end = str.length()) == 0) || ((((ch = str.charAt(0)) < '0') || (ch > '9')) && (!(sign = ch == '-') || (++idx == end) || ((ch = str.charAt(idx)) < '0') || (ch > '9')))) {
return Optional.empty();
}
int ival = 0;
for (; ; ival *= 10) {
ival += '0' - ch;
if (++idx == end) {
return Optional.of(sign ? ival : -ival);
}
if (((ch = str.charAt(idx)) < '0') || (ch > '9')) {
return Optional.empty();
}
}
}
}
您不需要任何工具,只需查看代码中的区别即可。这是相同的逻辑,尽管当它不是有效的 int
时抛出,而另一个 returns 是空的 Optional
.
只需利用其中一个,例如
public static int intValueOf(String str) {
return intValueOfOptional(str).orElseThrow(() -> new NumberFormatException(str));
}