在查看Comparators类的源代码时,我遇到了这些代码行.
class Comparators {
//...
enum NaturalOrderComparator implements Comparator<Comparable<Object>> {
INSTANCE;
@Override
public int compare(Comparable<Object> c1, Comparable<Object> c2) {
return c1.compareTo(c2);
}
@Override
public Comparator<Comparable<Object>> reversed() {
return Comparator.reverseOrder();
}
}
//...
}
Run Code Online (Sandbox Code Playgroud)
我想我明白这是做什么的.它是一个实现Comparator接口的Singleton实例.它使用实现Comparable接口的类的"compareTo"进行自然排序(如果我错了,请纠正我).
然而,我不明白为什么使用枚举完成它.我真的很喜欢Singletons的枚举,不要误会我的意思但在这种情况下我个人认为这会更简单:
public static final Comparator<Comparable<Object>> NATURAL_ORDER_COMPARATOR =
new Comparator<Comparable<Object>>() {
@Override
public int compare(Comparable<Object> c1, Comparable<Object> c2) {
return c1.compareTo(c2);
}
//...
}
Run Code Online (Sandbox Code Playgroud)
除了个人偏好之外,还有任何理由使用枚举来实现吗?
我是Kotlin的新手.当我在地图中学习存储属性时.我尝试以下用法.
class User(val map: MutableMap<String, String>) {
val name: String by map
}
Run Code Online (Sandbox Code Playgroud)
class User(val map: MutableMap<String, in String>) {
val name: String by map
}
Run Code Online (Sandbox Code Playgroud)
class User(val map: MutableMap<String, out String>) {
val name: String by map
}
Run Code Online (Sandbox Code Playgroud)
前两个都是工作,最后一个都失败了.使用out修饰符,字节码getName如下:
public final java.lang.String getName();
0 aload_0 [this]
1 getfield kotl.User.name$delegate : java.util.Map [11]
4 astore_1
5 aload_0 [this]
6 astore_2
7 getstatic kotl.User.$$delegatedProperties : kotlin.reflect.KProperty[] [15]
10 iconst_0
11 aaload
12 astore_3 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个注释处理器.这是一个经典的maven项目结构.
project
- src/main
- java // SOURCE_PATH
- resources // SOURCE_PATH
- target
- classes // CLASS_PATH and CLASS_OUTPUT
- generated-sources
- annotations // SOURCE_OUTPUT
Run Code Online (Sandbox Code Playgroud)
在与javac的maven中一切都很好.但是当我想将它集成到eclipse中时,我发现eclipse只支持CLASS_OUTPUT和SOURCE_OUTPUT.
我认为CLASS_OUTPUT也可以,因为它等于CLASS_PATH.然后我得到以下异常
org.eclipse.core.internal.resources.ResourceException: Resource '/test-annotation-use-processer/target/classes/config.properties' does not exist.
at org.eclipse.core.internal.resources.Resource.checkExists(Resource.java:335)
at org.eclipse.core.internal.resources.Resource.checkAccessible(Resource.java:209)
at org.eclipse.core.internal.resources.File.getContents(File.java:275)
at org.eclipse.core.internal.resources.File.getContents(File.java:268)
at org.eclipse.jdt.internal.apt.pluggable.core.filer.IdeInputFileObject.openInputStream(IdeInputFileObject.java:86)
Run Code Online (Sandbox Code Playgroud)
那么,该文件确实存在于磁盘中.我不知道日食有什么不对.
有没有办法在eclipse apt中获取资源?
以下代码打印 1、2
Observable.just(1)
.doOnSubscribe(d -> System.out.println(1))
.doOnSubscribe(d -> System.out.println(2))
.blockingSubscribe();
Run Code Online (Sandbox Code Playgroud)
这个打印 2, 1
Observable.just(1)
.doOnSubscribe(d -> System.out.println(1))
.subscribeOn(Schedulers.newThread())
.doOnSubscribe(d -> System.out.println(2))
.blockingSubscribe();
Run Code Online (Sandbox Code Playgroud)
在 RxJava1 中,这两个代码都打印“2, 1”,因为doOnSubscribe在下游订阅上游之前调用。
在 RxJava2 中,订阅是从上游到下游 ( Observer.onSubscribe),但doOnSubscribe仍会在订阅之前调用。于是混乱的秩序出现了。
即使我可以给出一个更混乱的情况:
Observable.just(1)
.doOnSubscribe(d -> System.out.println(1))
.doOnSubscribe(d -> System.out.println(2))
.subscribeOn(Schedulers.newThread())
.doOnSubscribe(d -> System.out.println(3))
.doOnSubscribe(d -> System.out.println(4))
.blockingSubscribe();
Run Code Online (Sandbox Code Playgroud)
它按照我的预期打印“3, 4, 1, 2”,但不是最预期的。
这是设计使然吗?如果是,有什么好处?