动态转换为每个数组类型
Dynamically cast to each array type
我正在使用以下方法在任何可能的情况下打印所有包内容。问题是 PMD 报告了两个 NcssCount
and CyclomaticComplexity
。我想改进代码以消除警告,而不仅仅是抑制它们。
private static String bundleToString(Bundle bundle) {
StringBuilder out = new StringBuilder("Bundle[");
if (bundle == null) {
out.append("null");
} else {
boolean first = true;
for (String key : bundle.keySet()) {
if (!first) {
out.append(", ");
}
out.append(key).append('=');
Object value = bundle.get(key);
if (value instanceof int[]) {
out.append(Arrays.toString((int[]) value));
} else if (value instanceof byte[]) {
out.append(Arrays.toString((byte[]) value));
} else if (value instanceof boolean[]) {
out.append(Arrays.toString((boolean[]) value));
} else if (value instanceof short[]) {
out.append(Arrays.toString((short[]) value));
} else if (value instanceof long[]) {
out.append(Arrays.toString((long[]) value));
} else if (value instanceof float[]) {
out.append(Arrays.toString((float[]) value));
} else if (value instanceof double[]) {
out.append(Arrays.toString((double[]) value));
} else if (value instanceof String[]) {
out.append(Arrays.toString((String[]) value));
} else if (value instanceof CharSequence[]) {
out.append(Arrays.toString((CharSequence[]) value));
} else if (value instanceof Parcelable[]) {
out.append(Arrays.toString((Parcelable[]) value));
} else if (value instanceof Bundle) {
out.append(bundleToString((Bundle) value));
} else {
out.append(value);
}
first = false;
}
}
out.append(']');
return out.toString();
}
我曾尝试使用以下逻辑将代码分成两部分,但 NcssCount
和 CyclomaticComplexity
只是移至执行所有数组转换的新方法。
if (value != null && value.getClass().isArray()) {
// the new method to call all the array casts
newMethodThatSuffersFromTheSameProblem(out, value);
} else if (value instanceof Bundle) {
out.append(bundleToString((Bundle) value));
} else {
out.append(value);
}
我能以某种方式对每种数组类型进行动态转换吗?
if (value != null && value.getClass().isArray()) {
out.append(Arrays.toString((<cast-to-class-array-[]>) value));
}
我也试过 out.append(Arrays.toString(value.getClass().cast(value)));
但出现编译错误 Cannot resolve method 'toString(capture<? extends java.lang.Object>)'
} else if (value instanceof String[]) {
out.append(Arrays.toString((String[]) value));
} else if (value instanceof CharSequence[]) {
out.append(Arrays.toString((CharSequence[]) value));
} else if (value instanceof Parcelable[]) {
out.append(Arrays.toString((Parcelable[]) value));
这3个if
可以换成一个
} else if (value != null && value.getClass().isArray())
out.append(Arrays.toString((Object[]) value));
对于其余部分,您可以使用静态 Map<Class, Function<Object, String>> convertors
并将其预填充为
convertors.put(int[].class, value -> Arrays.toString((int [])value));
...
然后使用
Function<Object, String> convertor = convertors.get(value.getClass());
if (convertor != null) {
out.append(convertor.apply(value));
} else ...
对于较旧的 ANDROID,其中 LAMBDA 不可用
interface ToString { String convert(Object object); }
...
static Map<Class, ToString> convertors = new HashMap();
convertors.put(int[].class, new ToString() { public String convert(Object value) { return Arrays.toString((int [])value); }});
...
然后使用
ToString convertor = convertors.get(value.getClass());
if (convertor != null) {
out.append(convertor.convert(value));
} else ...
我现在无法测试,但是有什么问题
if (value == null) {
// do whatever you want;
} else if (value instanceof Bundle) {
out.append(bundleToString((Bundle) value));
} else if (value.getClass().isArray()) {
out.append(Arrays.toString((Object[]) value));
} else {
out.append(value);
}
BTW 1:NCSS 和相关参数是提示。如果你有 20 个不同的案例,你就有了。虽然你总是应该考虑太大的数字,但有时@SuppressWarning 是正确的解决方案。
顺便说一句 2:制作静态 bundleToString(Bundle) 而不是覆盖 Bundle.toString() 的原因是什么?
我正在使用以下方法在任何可能的情况下打印所有包内容。问题是 PMD 报告了两个 NcssCount
and CyclomaticComplexity
。我想改进代码以消除警告,而不仅仅是抑制它们。
private static String bundleToString(Bundle bundle) {
StringBuilder out = new StringBuilder("Bundle[");
if (bundle == null) {
out.append("null");
} else {
boolean first = true;
for (String key : bundle.keySet()) {
if (!first) {
out.append(", ");
}
out.append(key).append('=');
Object value = bundle.get(key);
if (value instanceof int[]) {
out.append(Arrays.toString((int[]) value));
} else if (value instanceof byte[]) {
out.append(Arrays.toString((byte[]) value));
} else if (value instanceof boolean[]) {
out.append(Arrays.toString((boolean[]) value));
} else if (value instanceof short[]) {
out.append(Arrays.toString((short[]) value));
} else if (value instanceof long[]) {
out.append(Arrays.toString((long[]) value));
} else if (value instanceof float[]) {
out.append(Arrays.toString((float[]) value));
} else if (value instanceof double[]) {
out.append(Arrays.toString((double[]) value));
} else if (value instanceof String[]) {
out.append(Arrays.toString((String[]) value));
} else if (value instanceof CharSequence[]) {
out.append(Arrays.toString((CharSequence[]) value));
} else if (value instanceof Parcelable[]) {
out.append(Arrays.toString((Parcelable[]) value));
} else if (value instanceof Bundle) {
out.append(bundleToString((Bundle) value));
} else {
out.append(value);
}
first = false;
}
}
out.append(']');
return out.toString();
}
我曾尝试使用以下逻辑将代码分成两部分,但 NcssCount
和 CyclomaticComplexity
只是移至执行所有数组转换的新方法。
if (value != null && value.getClass().isArray()) {
// the new method to call all the array casts
newMethodThatSuffersFromTheSameProblem(out, value);
} else if (value instanceof Bundle) {
out.append(bundleToString((Bundle) value));
} else {
out.append(value);
}
我能以某种方式对每种数组类型进行动态转换吗?
if (value != null && value.getClass().isArray()) {
out.append(Arrays.toString((<cast-to-class-array-[]>) value));
}
我也试过 out.append(Arrays.toString(value.getClass().cast(value)));
但出现编译错误 Cannot resolve method 'toString(capture<? extends java.lang.Object>)'
} else if (value instanceof String[]) {
out.append(Arrays.toString((String[]) value));
} else if (value instanceof CharSequence[]) {
out.append(Arrays.toString((CharSequence[]) value));
} else if (value instanceof Parcelable[]) {
out.append(Arrays.toString((Parcelable[]) value));
这3个if
可以换成一个
} else if (value != null && value.getClass().isArray())
out.append(Arrays.toString((Object[]) value));
对于其余部分,您可以使用静态 Map<Class, Function<Object, String>> convertors
并将其预填充为
convertors.put(int[].class, value -> Arrays.toString((int [])value));
...
然后使用
Function<Object, String> convertor = convertors.get(value.getClass());
if (convertor != null) {
out.append(convertor.apply(value));
} else ...
对于较旧的 ANDROID,其中 LAMBDA 不可用
interface ToString { String convert(Object object); }
...
static Map<Class, ToString> convertors = new HashMap();
convertors.put(int[].class, new ToString() { public String convert(Object value) { return Arrays.toString((int [])value); }});
...
然后使用
ToString convertor = convertors.get(value.getClass());
if (convertor != null) {
out.append(convertor.convert(value));
} else ...
我现在无法测试,但是有什么问题
if (value == null) {
// do whatever you want;
} else if (value instanceof Bundle) {
out.append(bundleToString((Bundle) value));
} else if (value.getClass().isArray()) {
out.append(Arrays.toString((Object[]) value));
} else {
out.append(value);
}
BTW 1:NCSS 和相关参数是提示。如果你有 20 个不同的案例,你就有了。虽然你总是应该考虑太大的数字,但有时@SuppressWarning 是正确的解决方案。
顺便说一句 2:制作静态 bundleToString(Bundle) 而不是覆盖 Bundle.toString() 的原因是什么?