小编Dea*_* Xu的帖子

单例的Java功能接口为枚举

在查看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)

除了个人偏好之外,还有任何理由使用枚举来实现吗?

java singleton enums design-patterns

13
推荐指数
2
解决办法
703
查看次数

为什么kotlin不允许协变mutablemap成为委托?

我是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)

delegates jvm generic-variance kotlin

7
推荐指数
1
解决办法
357
查看次数

如何在eclipse jdt-apt环境中获得资源?

我正在开发一个注释处理器.这是一个经典的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_OUTPUTSOURCE_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中获取资源?

java eclipse annotation-processing eclipse-jdt

6
推荐指数
0
解决办法
106
查看次数

为什么 RxJava2 doOnSubscribe 以混乱的顺序运行?

以下代码打印 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”,但不是最预期的。

这是设计使然吗?如果是,有什么好处?

rx-java rx-java2

2
推荐指数
1
解决办法
2961
查看次数