小编Tom*_*sky的帖子

为什么Java中没有最终接口?

扩展接口只是添加了要在任何实现者中定义的附加操作,并且不能破坏任何现有的实现(与扩展类不同).但它可以改变(编辑3个常数)并因此改变常数的PERCIEVED值(编辑2由实现类看到).

例如,以下内容:

interface A {
  int TEST = 6;
}

interface B extends A {
  int TEST = 7;
}

public class InterfacesTest implements B {
  public static void main(final String[] args) {
    System.out.println(TEST);
  }
}
Run Code Online (Sandbox Code Playgroud)

产生7,或许接口的意图A是任何A包含一个test值为6 的字段的实现.

如果A被宣布为最终,我们可以确保所有实现A看到相同的值test.

那么有谁理解为什么这是不可能的?

  • PS:这不是这个问题的重复 ,我知道他们 不能是最终的,我对导致这个结果的设计决策背后的想法感兴趣.

  • PPS:我理解接口中的常量通常是一个坏主意,这不是问题.

编辑:请检查修订历史记录,这个问题的标题是以不反映问题意图的方式编辑的.对于回答我没问的问题的每个人都很抱歉.是的,接口字段是隐式公共静态最终的,不幸的是,这根本不是我感兴趣的.

编辑2要绝对清楚:这个问题是关于为什么接口不能阻止其他接口扩展它(通过最终或某些等效).

java oop interface

7
推荐指数
2
解决办法
1171
查看次数

CardLayouts:我怎么知道哪张卡可见?

我一直在查看Swing CardLayout的文档,似乎没有任何方法可以确定哪个卡当前显示在课堂上.然而,必须有一种方法来询问布局当前显示哪张卡,对吧?

由于项目的限制,我不能简单地扩展它并将此功能添加到子类中,因此如果没有这样的功能,那就意味着我无法跟踪组件在组件外部的状态(哎呀!)或者是否有一些其他选项埋藏在Swing深处?

java swing

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

在Eclipse中更改css样式表的格式

所以Eclipse可以在Source-> Format下自动格式化我的css文件,或者点击Cntl-Shift-F.

当我将选择器分组为单个规则时,eclipse将其格式化为:

.planner th,.planner td {
    border: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)

我真的希望Eclipse在选择器之间添加一个空格以提供可读性,如下所示:

.planner th, .planner td {
    border: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)

有没有什么办法可以配置Eclipse来做到这一点?我正在运行Eclipse Indigo.

css eclipse

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

传递零大小的数组,保存分配?

The Well-Grounded Java Developer的第114页的代码示例中,最后一行:

Update[] updates = lu.toArray(new Update[0]);
Run Code Online (Sandbox Code Playgroud)

包含注释:传递零大小的数组,保存分配

List<Update> lu = new ArrayList<Update>();
String text = "";
final Update.Builder ub = new Update.Builder();
final Author a = new Author("Tallulah");

for (int i=0; i<256; i++) {
  text = text + "X";
  long now = System.currentTimeMillis();
  lu.add(ub.author(a).updateText(text).createTime(now).build());
  try {
    Thread.sleep(1);
  } catch (InterruptedException e) {
  }
}

Collections.shuffle(lu);
Update[] updates = lu.toArray(new Update[0]);
Run Code Online (Sandbox Code Playgroud)

确切地说,节省了多少分配?

List#toArray(T [] a)的javadoc 提到:

如果列表适合指定的数组,则返回其中.否则,将使用指定数组的运行时类型和此列表的大小分配新数组.

这就是我记得的:如果传递给的数组toArray(T[] a)不能满足列表中的所有内容,则会分配一个新数组.显然,列表中有256个元素,不能放入大小为0的数组中,因此必须在方法内部分配一个新数组,对吧?

这个说明是不正确的?或者还有什么意思吗?

java arrays garbage-collection

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

是否可以使用PowerMockRule而不是PowerMockRunner在最终类上模拟静态方法?

根据PowerMock文档,我应该能够使用a PowerMockRule而不是@RunWith(PowerMockRunner.class)得到相同的结果.

我似乎找到了一个不存在这种情况的案例.

以下示例运行良好:

package com.test.powermockstatics;

import static org.junit.Assert.assertEquals;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

final class FinalClassWithStaticCall {
  public static int getIntStatic() {
    return 1;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(FinalClassWithStaticCall.class)
public class TestStaticMockingWithoutPowerMockRunner {
  @Test
  public void testStaticCall() {
    mockStatic(FinalClassWithStaticCall.class);
    when(FinalClassWithStaticCall.getIntStatic()).thenReturn(2);

    assertEquals(FinalClassWithStaticCall.getIntStatic(), 2);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是当切换到这样的规则时:

package com.test.powermockstatics;

import static org.junit.Assert.assertEquals;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;

import org.junit.Rule;
import org.junit.Test;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.agent.PowerMockAgent;
import org.powermock.modules.junit4.rule.PowerMockRule; …
Run Code Online (Sandbox Code Playgroud)

junit mockito powermock junit-rule junit-runner

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

Kotlin将回车符添加到多行字符串中

在Kotlin中,当我构建这样的多行字符串时:

value expected = """
                |digraph Test {
                |${'\t'}Empty1;
                |${'\t'}Empty2;
                |}
                |""".trimMargin()
Run Code Online (Sandbox Code Playgroud)

通过以下输出时,我发现该字符串缺少回车符(ASCII代码13):

println("Expected bytes")
println(expected.toByteArray().contentToString())
Run Code Online (Sandbox Code Playgroud)

输出:

Expected bytes
[100, 105, 103, 114, 97, 112, 104, 32, 84, 101, 115, 116, 32, 123, 10, 9, 69, 109, 112, 116, 121, 49, 59, 10, 9, 69, 109, 112, 116, 121, 50, 59, 10, 125, 10]
Run Code Online (Sandbox Code Playgroud)

当我尝试进行单元测试的某些代码通过a构建相同的String时,PrintWriter它通过lineSeparator属性来描述行:

/* 
 * Line separator string.  This is the value of the line.separator
 * property at the moment that the stream was …
Run Code Online (Sandbox Code Playgroud)

multiline multilinestring kotlin

7
推荐指数
2
解决办法
9090
查看次数

为什么不同的案件条件机构不在不同的范围内?

为什么不同的案例机构不会自动在自己的范围内?例如,如果我这样做:

switch(condition) {
  case CONDITION_ONE:
    int account = 27373;
  case CONDITION_TWO:
    // account var not needed here
  case CONDITION_THREE:
    // account var not needed here
  case CONDITION_FOUR:
    int account = 90384;
}
Run Code Online (Sandbox Code Playgroud)

编译器会抱怨局部变量重定义.我明白我可以这样做:

switch(condition) {
  case CONDITION_ONE: {
    int account = 27373;
  }
  case CONDITION_TWO: {
    // account var not needed here
  }
  case CONDITION_THREE: {
    // account var not needed here
  }
  case CONDITION_FOUR: {
    int account = 90384;
  }
}
Run Code Online (Sandbox Code Playgroud)

在每个要执行的语句集周围放置一个块,将每个account变量放在自己的范围内.但是为什么语言不能为我做这个呢?

你为什么要在CONDITION_ONE体内声明一个局部变量然后在CONDITION_TWO's中使用它?这似乎是一个可怕的想法,应该明确禁止,而不是暗示允许.

java switch-statement

6
推荐指数
2
解决办法
359
查看次数

如何使用Gradle仅重新运行失败的JUnit测试类?

受到这个整洁的TestNG任务的启发,以及这个SO问题,我认为我会迅速提出一些建议,以便仅重新运行Gradle中失败的JUnit测试。

但是在搜索了一会儿之后,我找不到任何类似的东西,它非常方便。

我想出了以下内容,它们似乎工作得很好,并<testTaskName>Rerun为项目中的每个类型的任务添加了一个任务Test

import static groovy.io.FileType.FILES

import java.nio.file.Files
import java.nio.file.Paths

// And add a task for each test task to rerun just the failing tests
subprojects {
    afterEvaluate { subproject ->
        // Need to store tasks in static temp collection, else new tasks will be picked up by live collection leading to StackOverflow 
        def testTasks = subproject.tasks.withType(Test)
        testTasks.each { testTask ->
            task "${testTask.name}Rerun"(type: Test) {
                group = 'Verification'
                description = "Re-run ONLY …
Run Code Online (Sandbox Code Playgroud)

junit gradle

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

自定义Lombok扩展需要Lombok包?

我一直在尝试向Lombok添加自定义注释.我的出发点是GitHub上的源代码.

我添加了一个工作正常的注释.我可以使用包含的eclipse启动(或构建一个jar并将其交换到我的eclipse.ini中)来测试和查看结果:我已经成功地将一个方法插入到一个类中.

现在,这只有在我将其他处理程序类放在lombok包下时才有效.如果我把它们放在另一个包装下面,它们根本就不起作用.我可以创建一个新的物理源目录,调整构建脚本以适当地包含它,并让我的新类存在那里,只要它在逻辑上打包lombok下的新类.

为什么是这样?不管怎么说呢?我想将我写入新顶级软件包的任何新增内容分开,以使它们与官方的lombok扩展区别开来.

java eclipse lombok

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

为什么使用 javadoc 无参数构造函数?

在《Effective Java》(第三版)第 56 条中,Joshua Bloch 指出:“公共类不应该使用默认构造函数,因为没有办法为它们提供文档注释。”

默认构造函数不会做任何意外的事情,但它只是创建一个新实例。什么样的信息应该记录在无参数构造函数的文档注释中,而这些信息不应该只存在于类注释中?

如果一个类在初始化块中具有有趣的行为(因为否则没有地方可以对它们进行注释),或者甚至是字段的非标准值分配(可能调用方法来获取初始值),我可以理解这样做。但对于大多数课程来说,这似乎并没有增加太多。我有什么遗漏的吗?

java default-constructor effective-java

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