public enum Dictionaries {
FIRST_DICTIONARY(FirstDictionary.class),
SECOND_DICTIONARY(SecondDictionary.class);
private Class<? extends DictionaryModel> clazz;
private Dictionary(Class<? extends DictionaryModel> clazz) {
this.clazz = clazz;
}
public Class<? extends DictionaryModel> clazz() {
return this.clazz;
}
}
Run Code Online (Sandbox Code Playgroud)
我有这个枚举。FirstDictionary并SecondDictionary实现DictionaryModel,这是为了使用此解决方案的标记接口。
现在我很想这样做:
Class<FirstDictionary> clazz = Dictionaries.FIRST_DICTIONARY.clazz();
这种设计显然是不可能的,我想不出实现这一目标的方法。有没有办法做到这一点?我可以访问整个代码,因此我可以修改所有内容,包括界面(甚至删除它)。
我简化了所有这一切,重点是每个字典都是一个数据库表,我有一个通用的 DAO(而不是每个字典的 DAO),现在我必须转换我想避免的每次读取的结果。我知道通用 DAO 不是一个好主意(或者根本不是 DAO)。
Optional<DictionaryModel> entity = dao.getByValue(Dictionaries.FIRST_DICTIONARY, value);
即使对于任何动态转换,在 DAO 本身或clazz()方法中,我似乎也无法解决。我觉得我在这里遗漏了一些明显的东西。
我很欣赏任何想法,甚至完全改变设计。
我使用的是Hibernate 5.2.10.Final,log4j 1.2.17(从此处开始),Weblogic 12.2.1。这是我的log4j.xml样子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC
"-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%5p] %d{yyyy-MM-dd HH:mm:ss} [%x] [%C.%M] - %m %n" />
</layout>
</appender>
<appender name="logFile" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="../logs/mylog.log"/>
<param name="MaxFileSize" value="100MB"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%5p] %d{yyyy-MM-dd HH:mm:ss} - %m %n" />
</layout>
</appender>
<logger name="interceptorLog" additivity="false">
<level value="INFO" />
<appender-ref ref="logFile" />
</logger>
<root>
<priority value="ALL" />
<appender-ref ref="logFile"/> …Run Code Online (Sandbox Code Playgroud) 我经常有一个问题Optional和相似的类Option,Try,Either从VAVR例如。
假设我有一些Optional,如果它为空,我想立即从一个方法中返回(无例外,因为我的方法Optional也在返回,所以getOrElseThrow不在图片之列),如果存在,我想进一步处理它。
public Optional<Integer> converter() {
Optional<String> opt = getSomething();
if(!opt.isPresent())
return Optional.empty();
String value = opt.get();
// some manipulations on value, such as map and flatMap would cause a huge mess
return Integer.parseInt(value);
}
Run Code Online (Sandbox Code Playgroud)
我只需要在值为空的情况下立即返回,就不能建立mapand的链flatMap。整个痛苦都在做.get()。有点像getOrElseThrow,但是用return代替throw会很棒- getOrElseReturn。显然在Java中是不可能的,因此我考虑在Kotlin中尝试此操作。
fun safeOptional(): Optional<Int> {
val extracted = Optional.of("123")
.getOrElseReturn { return Optional.empty() }
val …Run Code Online (Sandbox Code Playgroud)