我有一个设计问题
我得到了一个输入:
List<String>
类型,例如"java.lang.string"
... 我想验证数据是否为动态类型list.get(i)
更清楚:
我从数据库获取一个列表,如下所示list= {"java.lang.String", 'java.lang.Integer"}
我得到String
数据&#34; 123&#34;。我想验证数据是list.get(1)
的实例。我的列表和数据值是动态的,可以更改。
答案 0 :(得分:2)
在运行时,列表不属于List<String>
类型,仅在静态类型计算级别可见,并且与静态类型的表达式相关,而不是动态类型的实例。
在运行时,列表是某种类型,实现List
(例如,ArrayList
),而包含一种或另一种类型的对象。类型可以是任何类型。
因此,检查一般的方法必须基于反思。您必须按Class.forName(String)
检索该类,然后使用Class.isInstance(Object)
检查对象是否属于该类型。
答案 1 :(得分:0)
假设您有类似List<Object>
的内容,为什么不将其转换为具有原始列表中每种类型的列表的类,例如。
class HeapsOfLists {
List<String> strings;
List<Float> floats;
List<Double> doubles;//.. ect
}
只需将所有实例排序到相应的列表中,甚至可以在新的java流中按类进行一个很好的小组,或者instanceof
等。
但那只是我的2点。在其他编程语言中,您有参数匹配,它是为这类事物(某种程度)而构建的。当你在同一个系列中有不同的类型然后需要问每个人时,它永远不会变得非常有利,嘿你到底是什么意思!?!?!?
您将始终需要为新类型添加新代码,这就是为什么有接口来阻止此问题。虽然这是出于某种目的!(并不是说java是一种糟糕的语言)。这样jvm可以更快地运行并更好地优化代码!
我总是喜欢将java视为一种更接近计算机硬件的语言层,但不要像python或其他东西那样远!这样你仍然可以编写非常快的代码!
答案 2 :(得分:0)
我们假设一个方法boolean isValueOfType(String value, String className)
?
assertTrue(isValueOfType("123", "java.lang.Integer"))
assertFalse(isValueOfType("ABC", "java.lang.Integer"))
?如果没有像Marko上面建议的那样适用于每个类的代码,我认为没有任何方法可以实现此检查。
您可以通过尝试将value
转换为类型的函数映射来合理地实现它: -
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
public class Converters {
private final Map<String, Function<String, Boolean>> converters;
Converters() {
converters = new HashMap<>();
converters.put("java.lang.String", (v) -> true);
converters.put("java.lang.Integer", (v) -> {
try {
Integer.valueOf(v);
return true;
}
catch (NumberFormatException e) {
return false;
}
});
}
public boolean isValueOfType(String value, String className) {
Function<String, Boolean> converter = converters.get(className);
return converter.apply(value);
}
}
单元测试
import org.junit.Assert;
import org.junit.Test;
public class ConvertersTest {
@Test
public void testInteger() {
Converters converters = new Converters();
Assert.assertTrue(converters.isValueOfType("123", "java.lang.Integer"));
Assert.assertFalse(converters.isValueOfType("ABC", "java.lang.Integer"));
}
@Test
public void testString() {
Converters converters = new Converters();
Assert.assertTrue(converters.isValueOfType("123", "java.lang.String"));
Assert.assertTrue(converters.isValueOfType("ABC", "java.lang.String"));
}
}
以上可能过度,但基本上是类型和适当的转换器方法的查找表。
如果你不能使用Java 8(lambdas),那么可以使用普通接口实现类似的东西。