扩展接口只是添加了要在任何实现者中定义的附加操作,并且不能破坏任何现有的实现(与扩展类不同).但它可以改变(编辑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要绝对清楚:这个问题是关于为什么接口不能阻止其他接口扩展它(通过最终或某些等效).
我一直在查看Swing CardLayout的文档,似乎没有任何方法可以确定哪个卡当前显示在课堂上.然而,必须有一种方法来询问布局当前显示哪张卡,对吧?
由于项目的限制,我不能简单地扩展它并将此功能添加到子类中,因此如果没有这样的功能,那就意味着我无法跟踪组件在组件外部的状态(哎呀!)或者是否有一些其他选项埋藏在Swing深处?
所以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.
在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的数组中,因此必须在方法内部分配一个新数组,对吧?
这个说明是不正确的?或者还有什么意思吗?
根据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) 在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) 为什么不同的案例机构不会自动在自己的范围内?例如,如果我这样做:
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中使用它?这似乎是一个可怕的想法,应该明确禁止,而不是暗示允许.
受到这个整洁的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) 我一直在尝试向Lombok添加自定义注释.我的出发点是GitHub上的源代码.
我添加了一个工作正常的注释.我可以使用包含的eclipse启动(或构建一个jar并将其交换到我的eclipse.ini中)来测试和查看结果:我已经成功地将一个方法插入到一个类中.
现在,这只有在我将其他处理程序类放在lombok包下时才有效.如果我把它们放在另一个包装下面,它们根本就不起作用.我可以创建一个新的物理源目录,调整构建脚本以适当地包含它,并让我的新类存在那里,只要它在逻辑上打包lombok下的新类.
为什么是这样?不管怎么说呢?我想将我写入新顶级软件包的任何新增内容分开,以使它们与官方的lombok扩展区别开来.
在《Effective Java》(第三版)第 56 条中,Joshua Bloch 指出:“公共类不应该使用默认构造函数,因为没有办法为它们提供文档注释。”
默认构造函数不会做任何意外的事情,但它只是创建一个新实例。什么样的信息应该记录在无参数构造函数的文档注释中,而这些信息不应该只存在于类注释中?
如果一个类在初始化块中具有有趣的行为(因为否则没有地方可以对它们进行注释),或者甚至是字段的非标准值分配(可能调用方法来获取初始值),我可以理解这样做。但对于大多数课程来说,这似乎并没有增加太多。我有什么遗漏的吗?