尝试创建泛型数组的人有很多关于stackoverflow的问题,如下所示:
ArrayList<Foo>[] poo = new ArrayList<Foo>[5];
Run Code Online (Sandbox Code Playgroud)
答案当然是Java规范不允许您声明泛型数组.
我的问题是为什么?在java语言或java vm中,这种限制背后的技术原因是什么?这是我一直想知道的技术好奇心.
我有几个符合常见界面的枚举:
interface TableColumns
{
String getColumnName();
int getColumnIndex();
ColumnType getColumnType();
boolean isEditable();
int getColumnWidth();
}
Run Code Online (Sandbox Code Playgroud)
典型的实现是:
enum PointsTableColumns implements TrendTableColumns
{
POINTS_COLUMN("points_column", false, ColumnType.TEXT, 400, 0);
private String columnName;
private boolean editable;
private ColumnType columnType;
private int columnWidth;
private int columnIndex;
private PointsTableColumns (String columnName, boolean editable, ColumnType columnType,
int columnWidth,
int columnIndex)
{
this.columnName = columnName;
this.editable = editable;
this.columnType = columnType;
this.columnWidth = columnWidth;
this.columnIndex = columnIndex;
}
public boolean isEditable()
{
return editable;
}
public int getColumnIndex() …
Run Code Online (Sandbox Code Playgroud) 我将任务安排为:
ScheduledExecutorService dataService = Executors.newScheduledThreadPool(1);
Future<?> dataTimerHandle = dataService.scheduleAtFixedRate(runnable, 100, freq, TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)
这工作正常,没有缺陷。
但是,当某个标志变为true
用户操作时,便不再需要定期执行任务,而只需执行一次即可。然后,我尝试取消任务并仅提交一次,如下所示:
if(!dynamicUpdate) {
dataTimerHandle.cancel(true);
dataTimerHandle = dataService.submit(runnable);
}
else { //Reschedule again:
dataTimerHandle = dataService.scheduleAtFixedRate(runnable, 100, freq, TimeUnit.MILLISECONDS);
}
Run Code Online (Sandbox Code Playgroud)
但是似乎可运行对象仍在定期执行并且cancel()
未按预期工作。是否有其他替代策略?
java concurrency multithreading executorservice java.util.concurrent
我试图测试lambda表达式中的一些代码,这是从另一个类的回调.
class EmailSender {
private EmailBuilder emailBuilder;
public void send() {
String testEmail = emailBuilder.buildEmail("Test Email", bodyContentAppender());
//send testEmail
}
private Consumer<Email> bodyContentAppender() {
//how to test this through JUnit?
return email -> email.appendBody("Body Content");
}
}
interface EmailBuilder {
String buildEmail(String templateName, Consumer<Email> contentAppender);
}
Run Code Online (Sandbox Code Playgroud)
getBodyContent
调用方法中的lambda表达式是EmailBuilder
JUnit测试中的模拟依赖项EmailSender
.由于我在嘲笑行为EmailBuilder
,因此getBodyContent
不会从测试中调用内部代码.如何测试这样的作品?
编辑:
通过Argument Captors捕获lambda表达式在这种情况下不是解决方案,因为模拟行为EmailBuilder
并且不调用实际方法.其次,email.appendBody
对一个由外部API传递而不是直接创建的对象进行一些转换.
Java中枚举类型的默认反序列化被限制为readObject
和readObjectNoData
throw InvalidObjectException
.因此,枚举类型非常适合实现没有任何缺陷的单例类(Item 77,Effective Java,2nd Edition,Bloch).
Serializable
呢?恕我直言,我发现了一些模棱两可的东西。假设我们有以下类结构:
public class A
{
private int privateVar = 1;
protected int protectedVar = 2;
static class B extends A
{
public int getPrivateVariable()
{
return privateVar; //error: Cannot make a static reference to the non-static field memberVariable
}
public int getProtectedVariable()
{
return protectedVar; //OK: Why?
}
public int getPrivateUnfair()
{
return super.privateVar; //Why this can be accessed using super which the protected member doesn't require.
}
}
}
Run Code Online (Sandbox Code Playgroud)
protected
和变量不同?private
但是,如果嵌套类是非静态内部类,情况不是这样吗?我想用JUnit测试来验证我在Java中的集合的排序算法.如果我将"B","C","A"输入到集合中并希望对其进行排序(例如按字母顺序排列),使用JUnit进行测试的正确方法是什么?
我实现了Comparable接口,并希望确保我的排序正常.
我想这个问题可以扩展到Java或JUnit以外的任何语言的一般测试.
我正在使用 AG Grid React。我有一千行数据。我试图根据它们的索引选择一系列行。
gridOptions.api.forEachNode(node => {
if (node.childIndex >= startIndex && node.childIndex < endIndex) {
node.setSelected(true)
}
});
Run Code Online (Sandbox Code Playgroud)
事实证明这是非常糟糕的,通常在 UI 上需要 30 秒。似乎setSelected
触发了多个渲染周期。正确的做法是什么?
java ×7
enums ×2
junit ×2
ag-grid ×1
arrays ×1
charts ×1
concurrency ×1
d3.js ×1
datetime ×1
generics ×1
inheritance ×1
java-8 ×1
javascript ×1
lambda ×1
singleton ×1
unit-testing ×1