小编awf*_*fun的帖子

Kotlin - 为非数据类生成toString()

情况:

我有一个带有lateinit字段的类,因此它们不在构造函数中:

class ConfirmRequest() {
    lateinit var playerId: String
}
Run Code Online (Sandbox Code Playgroud)

我想要一个toString()包含所有字段的方法,并且不想手动编写,以避免锅炉打印.在Java中,我会使用Lombok @ToString注释来解决这个问题.

题:

有没有办法在Kotlin中实现它?

java tostring kotlin

24
推荐指数
3
解决办法
9258
查看次数

切换操作符是原子的吗

在文档中,据说您可以if-else多次使用或者switch-case:

int condition;

setCondition(int condition) {
    this.condition = condition;
}
Run Code Online (Sandbox Code Playgroud)

交换机箱

switch (condition) {
  case 1: print("one"); break;
  case 2: print("two"); break;
Run Code Online (Sandbox Code Playgroud)

要么

if (condition == 1) { print("one"); }
else if (condition == 2) { print("two"); }
Run Code Online (Sandbox Code Playgroud)

接下来,condition声明volatilesetCondition()从多个线程调用方法. If-else不是原子和volatile变量write是同步动作.因此,"one"和"two"字符串都可以在最后一个代码中打印出来.

如果使用了一些具有初始值的方法局部变量,则可以避免:

int localCondition = condition;
if (local condition == ..) ..
Run Code Online (Sandbox Code Playgroud)

switch-case操作员是否持有一些变量的初始副本?如何用它实现交叉线程操作?

java multithreading if-statement switch-statement conditional-statements

17
推荐指数
2
解决办法
1498
查看次数

Java 9 HttpClient挂起

我正在试验HTTP/2客户jdk 9-ea+171.代码取自此示例:

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
    .uri(new URI("https://www.google.com/"))
    .build();

HttpResponse<String> response
        = client.send(request, HttpResponse.BodyHandler.asString());
Run Code Online (Sandbox Code Playgroud)

但客户端永远挂在最后一行.请指教如何解决?

调试显示它在方法中无限等待waitUntilPrefaceSent().

java http2 java-9

8
推荐指数
1
解决办法
481
查看次数

让 jUnit 运行程序使用不同的参数多次运行测试类

我有一些 jUnit4 测试类,我想使用注释中传递的不同参数运行多次。例如,像这样:

@RunWith(MyClassRunner.class)
@Params("paramFor1stRun", "paramFor2ndRun")
class MyTest {
  @Test
  public void doTest() {..}
}
Run Code Online (Sandbox Code Playgroud)

我认为 Runner 可以帮助我,但我不知道如何实现。你能给建议吗?

java unit-testing junit4

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

Spring java config - 创建也在运行时创建的 bean 列表

我有一个由 Spring 创建的游戏室列表。每个房间对应一些规则(即enum),代码为:

@Bean
List<Room> rooms() {
    return Arrays.stream(Rules.values())
        .map(rule -> new Room(rule))
        .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

但现在我也需要房间@Beans:我希望 Spring 处理其中的@EventListener注释。但是,我不想在配置中手动声明它们,因为Rules将来可以更新枚举。我怎么解决这个问题?谢谢。

java spring config javabeans

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

Kotlin - 可空场的非空吸气剂

我是Kotlin的新手,我尝试将一个小型Java项目改造成这种新语言.我在我的项目中使用mongodb,我有一个类,例如:

class PlayerEntity {

  constructor() {} //for mongodb to create an instance

  constructor(id: ObjectId, name: String) { //used in code
    this.id = id
    this.name = name
  }

  @org.mongodb.morphia.annotations.Id
  var id: ObjectId? = null

  var name: String? = null
}
Run Code Online (Sandbox Code Playgroud)

由于空构造函数,我必须将id字段标记为nullable(var id: ObjectId?).当我尝试从另一个类访问此字段时,我必须使用非null检查:thePlayer.id!!.但我的应用程序的逻辑是该id字段永远不为null(mongo创建一个Player实例并立即设置id字段).而且我不想在任何地方进行非空检查.

我试图创建一个非null的getter,但它不能编译:

var id: ObjectId? = null
    get(): ObjectId = id!!
Run Code Online (Sandbox Code Playgroud)

我也可以为id创建一些存根,并在构造函数中使用它,但这看起来像一个肮脏的黑客:

val DUMMY_ID = new ObjectId("000000000000000000000000");
Run Code Online (Sandbox Code Playgroud)

那么有解决问题的解决方法吗?

java getter nullpointerexception non-nullable kotlin

6
推荐指数
1
解决办法
1642
查看次数

JDBC和utf8mb4编码表情符号

我使用Mysql 5.7.18并且在更新时遇到了表情符号的问题JDBC.

表创建:body是键入的utf8,localizationsutf8mb4

CREATE TABLE `my_table` (
  `body` TEXT NOT NULL,
  `localizations` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)

现在我SequelPro用来插入数据.为了正确地做,我按Database -> View using encoding -> utf8mb4.插入代码:

INSERT INTO my_table(body, localizations) VALUES ('test', '');
Run Code Online (Sandbox Code Playgroud)

然后我尝试从jdbc加载它.这是当前在项目中使用的连接字符串部分(此处仅使用格式化以方便阅读):

?useEncoding=true
&characterEncoding=UTF-8
Run Code Online (Sandbox Code Playgroud)

它成功localizations从数据库加载.但是从JDBC更新表会返回错误:

SQLException: Incorrect string value: '\xF0\x9F\x94\xA5"}...' for column 'localizations'
Run Code Online (Sandbox Code Playgroud)

我想这是因为连接编码.SequelPro有一个Show server variables选项,这里的DIFF utf8utf8mb4:

character_set_client = …
Run Code Online (Sandbox Code Playgroud)

java mysql jdbc emoji utf8mb4

6
推荐指数
1
解决办法
2396
查看次数

防止POSIX xargs尝试运行空命令

我对bash不太好,但我正在尝试创建一个脚本来杀死一些java进程:

/usr/ucb/ps -auxww    \
  | grep 'XUnit'      \
  | grep -v 'grep'    \
  | cut -c -2000      \
  | awk '{print $2;}' \
  | xargs kill
Run Code Online (Sandbox Code Playgroud)

cut这里使用的是因为awk行过长而失败(请参阅awkLINE_MAXPOSIX规范中的限制参考).

当没有这样的进程时会出现问题 - xargs尝试kill不带参数运行,从而导致错误.

我的xargs不接受-r或者--no-run-if-emptyargs,正如在没有指定POSIX合规性的相关问题的答案中所建议的那样.

shell posix kill xargs

5
推荐指数
1
解决办法
365
查看次数

使用 Gradle 的 Kotlin 脚本配置获取属性的正确方法

我有一处房产gradle.properties

answer = 42
Run Code Online (Sandbox Code Playgroud)

用于build.gradle

println "answer is ${answer}"
Run Code Online (Sandbox Code Playgroud)

现在我想用 Kotlin 脚本替换 Groovy 以进行 Gradle 配置。如何以正确的方式访问属性?我现在在做的build.gradle.kts是:

fun property(name: String) = properties[name] as String

println("answer is " + property("answer"))
Run Code Online (Sandbox Code Playgroud)

这似乎不是很方便。谢谢!

groovy gradle kotlin

5
推荐指数
1
解决办法
3892
查看次数

Gradle 依赖项 - 将一个模块替换为另一个模块

在我的项目中,gradle 显示了依赖关系:

com.google.guava:guava:19.0 -> 20.0-rc1
com.google.guava:guava-jdk5:17.0
Run Code Online (Sandbox Code Playgroud)

Afaik gradle 选择同名依赖项的最新版本,这就是 v19 更改为 v20 的原因。有没有办法让gradle使用guava而不是guava-jdk5?

java dependencies alias gradle guava

4
推荐指数
1
解决办法
2785
查看次数