我在编译时得到了一个我没有预料到的匿名类。相关代码如下,再进行更详细的解释:
完整的 CircuitType.java:
public enum CircuitType { V110A20, V110A30, V208A20, V208A30 }
来自 Auditor.java,第 3-9 行:
public class Auditor {
private String[] fileNames;
private int numV110A20;
private int numV110A30;
private int numV208A20;
private int numV208A30;
来自 Auditor.java,第 104-121 行:
[...]
switch (newCircuit.getType()) {
case V110A20:
this.numV110A20++;
break;
case V110A30:
this.numV110A30++;
break;
case V208A20:
this.numV208A20++;
break;
case V208A30:
this.numV208A30++;
break;
default:
System.err.println("An Error Has Occured.");
System.exit(-1);
break;
}
[...]
来自 Circuit.java,第 1-5 行:
public class Circuit {
private CircuitType myType;
public CircuitType getType() {
return this.myType;
}
[...]
当命令
javac *.java
被执行,生成一个匿名类Auditor$1.java。显然,这些文件都在一个文件系统目录中并排放置,不包含任何其他内容。
104-121行被注释掉时,不生成匿名类。
起初我以为是包的问题,所以把这三个类放在一个包里,但我对包的了解还不够多,无法让它正常工作。如果确实是包裹问题,有人可以指导我确切地标记它们吗?不过,如果不需要的话,我宁愿不必打包它们。
匿名类成为问题的原因,除了此类通常表示命名空间问题之外,还在于它破坏了我用于自动编译的 Makefile。
更新
附件是一个控制台 session ,我希望它可以揭示这个谜团:
% javap 'Auditor$1'
Compiled from "Auditor.java"
class Auditor$1 extends java.lang.Object{
static final int[] $SwitchMap$CircuitType;
static {};
}
最佳答案
我已经继续构建了一个小项目,其中包含您发布的源代码和足够的框架来编译它。我有 3 个类文件:Circuit.class、CircuitType.class 和 Auditor.class - 正如预期的那样。
所有这些都在 Java 1.6 下。 但正如其他人所指出的,我认为您对问题的诊断是错误的。
匿名类很容易意外生成:通常是这样的结构
Circuit myCircuit = new Circuit() {
public CircuitType getCircuitType() {
return XXX;
}
}
将创建一个,例如。如果您提供更多代码,优秀的 SO 人员也许能够查明您的错误。
使用 javap 或更好的“真正的”Java 反汇编程序(如 JD)反汇编您的类文件可能会很有趣且具有指导意义。
更新
将您的新审核员代码添加到我的...没有变化。没有匿名类。
你的代码当然是正确的(在我们能看到的范围内)但是设计不是很OO。有些人会指出,每次出现新的电路类型时,您都必须扩展计数器声明和 switch 语句。
您也没有充分利用枚举的“特殊功能”。我有一个非常简化的 Auditor 方法:
private int[] counters = new int[CircuitType.values().length];
public void tallySomething() {
Circuit newCircuit = new Circuit();
counters[newCircuit.getType().ordinal()]++;
}
更新 2
我发现您的 javap 输出非常有启发性。请参阅下面我的评论。
我的结论:
开关make 并使用 ant 来接受匿名类和 Java 的其他奇怪之处。由于您只是因为您的非标准编译设置而遇到问题,所以我会使用最后一个解决方案并解决那里的问题。
关于java - 在匿名类中引用公共(public)枚举结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1970713/
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我没有理解以下行为(另请参阅inthisSOthread):defdef_testputs'def_test.in'yieldifblock_given?puts'def_test.out'enddef_testdoputs'def_testok'endblock_test=procdo|&block|puts'block_test.in'block.callifblockputs'block_test.out'endblock_test.calldoputs'block_test'endproc_test=procdoputs'proc_test.in'yieldifblock_gi
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/