"Unknown type"通过Closure Compiler运行一个相当大的库时,我收到了很多警告,当我的类型在自动执行的匿名函数中声明时,它们似乎就出现了.这没有什么奇特之处,但是如果我将自执行函数剥离出来,类型声明似乎起作用(至少在这个简单的测试中).
我不确定我的代码注释是否有问题,或者代码中是否存在任何违法行为,但我认为这都是犹太教和模块化API的标准方法.
以下测试代码创建一个命名空间(只是一个普通的旧JS对象)并附加一个枚举(一个对象文字)和一个函数.
var mynamespace = {};
(function (mynamespace) {
/**
* Some enum.
* @enum {number}
*/
mynamespace.SomeEnum = {
FOO: 1,
BAR: 2
};
/**
* Frazzle some type.
* @param {mynamespace.SomeEnum} qux The type to frazzle.
* @return {boolean} whether the operation succeeded.
*/
mynamespace.frazzle = function(qux) {
return true;
}
}(mynamespace));
// call it
mynamespace.frazzle(mynamespace.SomeEnum.FOO);
Run Code Online (Sandbox Code Playgroud)
看起来很好,对吗?闭包编译错误:
[jscomp] Compiling 1 file(s) with 37 extern(s)
[jscomp] X:\dev\solclientjs\sdk\tools\jscomptest.js:14: WARNING - Parse error. Unknown type mynamespace.SomeEnum
[jscomp] …Run Code Online (Sandbox Code Playgroud) 我已经开始使用MBean来公开有关应用程序的一些信息.相当多的HOWTO文档/教程/博客文章的整体性/样品在线教你如何实现一个MBean与MBean服务器注册它,但从来不提(或仅粗略)从服务器注销的MBean.
我担心MBean需要引用一个相当重量级的对象才能提供有关该对象的状态信息.
Platform MBean Server是否维护对MBean的弱引用,或其他一些此类技巧,以确保如果您的应用程序不再持有任何引用,它最终会获得GC?注销通常是不必要的,从而解释为什么没有人在JMX教程中讨论它?
假设您正在维护最初几年前发布的API(在Java获得enum支持之前),并且它定义了一个枚举值为int的类:
public class VitaminType {
public static final int RETINOL = 0;
public static final int THIAMIN = 1;
public static final int RIBOFLAVIN = 2;
}
Run Code Online (Sandbox Code Playgroud)
多年来,API已经发展并获得了Java 5特有的功能(通用接口等).现在您要添加一个新的枚举:
public enum NutrientType {
AMINO_ACID, SATURATED_FAT, UNSATURATED_FAT, CARBOHYDRATE;
}
Run Code Online (Sandbox Code Playgroud)
"旧式"int-enum模式没有类型安全性,不可能添加行为或数据等,但它已发布并正在使用中.我担心混合两种枚举方式对API的用户来说是不一致的.
我看到三种可能的方法:
放弃并定义新的枚举(NutrientType在我的虚构示例中)作为类的一系列整数VitaminType.你得到了一致性,但你没有利用类型安全和其他现代功能.
决定在已发布的API中存在不一致:保持VitaminType原样,并添加NutrientType为enum.采用a的VitaminType方法仍然被声明为采用int,采用a的方法NutrientType被声明为采用这种方法.
弃用VitaminType该类并引入新的VitaminType2枚举.将new定义NutrientType为枚举.
恭喜,在接下来的2 - 3年内,您可以杀死已弃用的类型,您将要处理每个方法的弃用版本,这些方法VitaminType将int作为int并添加每个方法的新foo(VitaminType2 v)版本.您还需要为每个已弃用的foo(int v)方法及其相应的foo(VitaminType2 v) …
在Windows上使用Sun Java VM 1.5或1.6,我连接一个非阻塞套接字.然后我填写一条ByteBuffer消息输出,并尝试进入write()SocketChannel.
如果要写入的数量大于套接字TCP输出缓冲区中的空间量,我希望写入只能部分完成(这是我所期望的直观,这也是我对文档的理解),但那不是什么发生.该write() 总似乎返回报告写全款,即使是几兆字节(套接字的SO_SNDBUF为8KB,多少,比我的多兆字节输出消息少得多).
这里的问题是我无法测试处理部分写入输出的情况的代码(注册WRITE选择器的兴趣集并执行select()等待直到写入其余部分),因为这种情况似乎永远不会发生.我不明白的是什么?