考虑以下简单的代码示例:
public class TestStaticImport {
static enum Branches {
APPLE,
IBM
}
public static void doSomething(Branches branch) {
if (branch == APPLE) {
System.out.println("Apple");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们将尝试编译此代码,我们将收到错误消息:
java: cannot find symbol
symbol: variable APPLE
location: class TestStaticImport
Run Code Online (Sandbox Code Playgroud)
这可以通过引入静态导入来解决enum:
import static ... TestStaticImport.Branches.*
但是在这个时刻(对我来说)难以理解的事情开始了:
这个解决方案工作正常,一切都很好编译,直到类TestStaticImport将被移动到空的根包,即没有任何
package blablabla; 在这个java文件的顶部;
代码行:import static TestStaticImport.Branches.*;在我的Intellij IDEA中突出显示为有效代码(IDE的名称无关紧要,仅供参考),但当我尝试编译此类代码时出现以下错误:
java: package TestStaticImport does not exist
所以,实际上有两个问题:
1)主要问题:为什么不能import static从空目录?
2)除了静态导入之外,允许使用其名称(即APPLE代替Branches.APPLE)的枚举字段的代码引用的另一种方式(如果存在)是什么?
PS请不要告诉我,空包装是丑陋的风格等等.这个问题只是理论问题.
方法中存在一个奇怪的限制java.io.DataOutputStream.writeUTF(String str),它将utf-8编码字符串的大小限制为65535字节:
if (utflen > 65535)
throw new UTFDataFormatException(
"encoded string too long: " + utflen + " bytes");
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为:
static int writeUTF(String str, DataOutput out)方法可以轻松解决此限制java.io.DataInputStream.readUTF().根据上面我无法理解这种限制writeUTF方法的目的.我错过了什么或误解了什么?
Java 8 Update 40(8u40)的发行说明指出:
已弃用的标准覆盖机制和扩展机制已被弃用,可能会在将来的版本中删除.没有运行时更改.建议使用"认可标准覆盖"或"扩展"机制的现有应用程序远离使用这些机制.
还有一个问题澄清了Jigsaw(计划用于Java SE 9,AFAIK),这将以某种方式用模块化方法取代:
http://bugs.java.com/view_bug.do?bug_id=8065675
我知道Oracle现在想要弃用这些机制,因为它们不再支持它们在Java SE 9中了.
另一方面,在不提供替代方案的情况下弃用某些东西并不是一种好的做法.
发布说明指出:"建议现有应用程序迁移远离使用这些机制"
那么你怎么能"远离"
在Java SE 8中?
使用AWS lambda但不使用API Gateway或处理http(s)请求的方法有哪些Amazon Kinesis?有可能吗?
特别是我想实现我自己的REST API但不支付API Gateway服务费用AWS lambda.
我不是要求教程或库,这是关于Amazon services架构的原则.
这一切都与Java 8运行时有关.
根据此问题的动机:错误java.lang.OutOfMemoryError:超出了GC开销限制
最近我和某人就这个错误进行了辩论.
根据我的理解,这个错误本身不能被视为JVM失败的"主要"原因.
我的意思是广泛的垃圾收集本身不是失败的原因.广泛的垃圾收集总是由很少的可用内存量引起,这导致频繁的GC调用(并且核心原因可能是内存泄漏).
如果我正确地理解了我的对手的位置,他认为很多有资格在系统中产生GC的小对象会导致他们经常收集,导致这个错误的原因.所以魔鬼不是内存泄漏或低内存限制,而是GC调用频率本身.
这是我们有不同观点的地方.
根据我的理解,有多少小符合GC过程的小对象产生(即使它不是一个好的设计,可能你应尽可能减少这个数量).如果你有足够的内存,并且没有明显的内存泄漏,那么在某些时候GC会收集这些对象的大部分,所以它应该不是问题.至少这不会导致系统崩溃.
简要回顾一下我的立场:如果你有GC overhead limit exceeded,那么要么你有一种内存泄漏,要么你只需要增加内存限制.
简要回顾一下我的对手的位置:如果你生产了许多符合GC的资格的小物件,那已经成为一个问题,因为它本身就是一个问题GC overhead limit exceeded.
我错了,错过了什么?
我从这里导入了jfreechart-fse:https://github.com/jfree/jfreechart-fse ,我已将其导入eclipse作为maven项目.
之后,我有很多问题,例如在org.jfree.chart paskage中的类ChartPanel中,eclipse没有看到"implements"部分,并且注意到
@Override
public void actionPerformed(ActionEvent event) {...}
Run Code Online (Sandbox Code Playgroud)
作为一个问题.在许多其他情况下也是如此.
你能说出这有什么问题吗?
我的html页面上有一个tinymce文本框.在这个文本框下面,我有一个包含文件系统的表,我可以在其中导航以查找我的图像.我希望能够单击此表中的图像并将其插入timymce文本框中.我该怎么做呢?
我protected在搜索我的问题的解决方案时发现了使用修饰符:忽略带有单元的反射词组件ReflectionComparator
在org.unitils.reflectionassert.ReflectionComparatorFactory课堂上有签名的方法:
protected static List<Comparator> getComparatorChain(Set<ReflectionComparatorMode> modes)
但这只是特殊情况.
毕竟我们总是可以扩展这样的任何非final类,并protected使用new public修饰符"覆盖"它的静态方法.说,我们有课A:
public class A {
protected static void test() {
// do some stuff
}
}
Run Code Online (Sandbox Code Playgroud)
并希望在另一个包中使用它:
public class UseA {
private static class MyA extends A {
public static void test() {
A.test();
}
}
void useA() {
// A.test(); compile error, sure
MyA.test();
}
}
Run Code Online (Sandbox Code Playgroud)
当某些static方法被宣布为时,我将我的问题集中在一般情况上protected.我不是在询问非静态字段或方法,因为在某些情况下,类可以具有私有构造函数或具有许多特殊参数的非常复杂的构造函数.但是如果整个班级不是这样的"隐藏"静态方法的目的是什么final?这种用法是错误还是只是非常弱的"保护"?
Java-8允许在接口内部定义静态方法,但仅通过接口名称限制它的调用:
9.4:接口可以声明静态方法,这些方法在不引用特定对象的情况下被调用.
例如:
interface X {
static void y() {
}
}
...
X x = new X() {};
x.y();
Run Code Online (Sandbox Code Playgroud)
导致错误:
error: illegal static interface method call
x.y();
^
the receiver expression should be replaced with the type qualifier 'X'
Run Code Online (Sandbox Code Playgroud)
通常在JLS中,这种禁令有一个解释.在这种情况下,我没有发现任何详细的信息.所以我正在寻找对此规则的全面或权威解释:为什么禁止通过特定对象引用调用静态方法?它打破了什么?
众所周知,Javadoc谈到了Stream界面:
Streams有一个BaseStream.close()方法并实现AutoCloseable,但几乎所有的流实例实际上都不需要在使用后关闭.通常,只有源为IO通道的流(例如Files.lines(Path,Charset)返回的流)才需要关闭.大多数流都由集合,数组或生成函数支持,不需要特殊的资源管理.(如果流确实需要关闭,则可以在try-with-resources语句中将其声明为资源.)
好的,但同时flatMapToInt在这个界面中有类似的方法:
IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);
Run Code Online (Sandbox Code Playgroud)
Javadoc规范说:
每个映射的流在其内容放入此流后关闭.
所以,我没有想到:如果IntStream没有设计在他的源代码中有IO通道,为什么它在这个方法中关闭?
例如,ReferencePipeline实现以这种方式执行:
try (IntStream result = mapper.apply(u)) {
if (result != null)
result.sequential().forEach(downstreamAsInt);
}
Run Code Online (Sandbox Code Playgroud)
更普遍的问题可能是:我们是否应该关注像IntStream(或其后代)那样关闭流?如果没有,那为什么要flatMapTo*关心?
编辑 @Tunaki提供了非常有趣的电子邮件链接.但这一切都是关于flatMap,我同意我们应该在一般情况下关闭流.但我的问题是关于特殊情况:flatMapToInt,flatMapToLong等等,在这里我没有看到收盘流的任何必要性.
EDIT-2 @BrianGoetz在这里上诉,因为这是他引用的电子邮件,因此他在主题:)
java ×9
java-8 ×3
aws-lambda ×1
eclipse ×1
heap-memory ×1
importerror ×1
java-9 ×1
java-stream ×1
javascript ×1
jfreechart ×1
jls ×1
jvm ×1
oop ×1
protected ×1
restrictions ×1
tinymce ×1
tinymce-4 ×1