一个METHOD中的Java Local Inner Class,它是如何由JVM处理的?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了一个METHOD中的Java Local Inner Class,它是如何由JVM处理的?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4805字,纯文字阅读大概需要7分钟。
内容图文
![一个METHOD中的Java Local Inner Class,它是如何由JVM处理的?](/upload/InfoBanner/zyjiaocheng/808/8394342a95f340b6b85c745c1cb11e06.jpg)
如果您查看下面的方法,您将在方法中声明一个声明的本地类.原因是,例如styleIt0方法多次使用并且仅在此方法中使用.它仅与该方法有关.
将其分解为私有方法并不能清楚地了解它的使用位置以及通过查看它所做的工作.我发现大块代码不可读,并且经常希望以小方法分解,尽管它们只与一种方法相关.
对于类中的多个方法执行此操作将使得非常不清楚每个私有方法的用途和使用位置,并且与仅可能在多个方法之间共享的其他私有方法相比,它仅由单个方法使用.
这就是为什么我有时更喜欢在方法中声明其他方法.允许以“标准”方式在方法中声明方法会很棒,但我认为这样的方法可以达到Java 6的唯一方法是通过在方法中声明本地内部类中的方法,如下所示.
我的问题是:
这种用法是否有任何性能问题?这样一个声明的类的内存占用量是多少,并且通过重复调用具有本地内部类的方法是什么? JVM是否会在编译时编译此类一次,还是以其他方式处理?
其他想法:
本地内部类不能声明为静态,并且它们的方法和属性不能是静态的.我想知道为什么!?
现在每次调用方法时我都被迫创建一个新实例.在本地内部类中使用静态方法本来是很棒的,我认为没有充分的理由说明为什么这样做不可能?内在的方法会更好!
有些人可能会争辩说,这种编码方式没有用,难看或者这些类可以在其他地方声明.请不要在那个方向劫持线程.无论有什么人争论,我碰巧发现内部方法很有用.我的主要兴趣涉及Java语言中此类用法的性能问题.
谢谢(下面的代码)
private void addBottomTable(Slide slide, User user) {
class Styler {
public void styleIt0(RichTextRun rt) {
rt.setFontName(font);
rt.setFontSize(12);
rt.setBold(true);
}
public void styleIt1(RichTextRun rt) {
rt.setFontName(font);
rt.setFontSize(10);
rt.setBold(true);
}
public void styleTable(Table table) {
// Style the table
double numberOfCakes = width / PADDING;
int firstColumnWidth = (int) ((3 / 12d) * numberOfCakes * PADDING); // Take 3/12 of the cakes and calculate the width
table.setColumnWidth(0, firstColumnWidth);
table.setColumnWidth(1, width - firstColumnWidth - PADDING * 2); // Minus padding because we use that one for moveTo at the end, and we do want padding
// at the end
Line border = table.createBorder();
border.setLineStyle(Line.PEN_PS_DASH);
border.setLineColor(Color.black);
border.setLineWidth(1.0);
table.setAllBorders(border);
}
}
Styler styler = new Styler();
EmployeeCV employeeCV = user.getEmployeeCv();
Table table = new Table(3, 2);
styler.styleTable(table);
// == Cells ==
// Row 0 = Specific strengths
TextRun textRun = table.getCell(0, 0).getTextRun();
RichTextRun rt = textRun.getRichTextRuns()[0];
rt.setText("Specific strengths: ");
styler.styleIt0(rt);
// Content column
textRun = table.getCell(0, 1).getTextRun();
rt = textRun.getRichTextRuns()[0];
StringBuffer s = new StringBuffer();
List<LeadershipTopStrengths> strengths = employeeCV.getTopStrengthsList();
int i = 0;
while (i < strengths.size()) {
LeadershipTopStrengths strength = strengths.get(i);
if ( strength != null ) {
s.append(safeEnumItemDescription(strength));
// Add newline but not on the last one
if (i < (strengths.size() - 1) ) {
s.append(SIMPLE_NEWLINE);
}
rt.setText(s.toString());
styler.styleIt1(rt);
}
i++;
}
// Row 1 = Mobility
textRun = table.getCell(1, 0).getTextRun();
rt = textRun.getRichTextRuns()[0];
rt.setText("Mobility: ");
styler.styleIt0(rt);
// Content column
textRun = table.getCell(1, 1).getTextRun();
rt = textRun.getRichTextRuns()[0];
s = new StringBuffer();
List<InternationalMobility> mobilities = employeeCV.getInternationalMobilityList();
i = 0;
while (i < mobilities.size()) {
InternationalMobility mobility = mobilities.get(i);
if(mobility != null){
s.append(safeEnumItemDescription(mobility));
// Add newline but not on the last one
if (i < (mobilities.size() - 1) ) {
s.append(SIMPLE_NEWLINE);
}
rt.setText(s.toString());
styler.styleIt1(rt);
}
i++;
}
// Row 2 = Additional
textRun = table.getCell(2, 0).getTextRun();
rt = textRun.getRichTextRuns()[0];
rt.setText("Additional information: ");
styler.styleIt0(rt);
// Content column
// TableCell cell = table.getCell(2, 1);
slide.addShape(table);
table.moveTo(PADDING, height / 2 + PADDING * 2); // MoveTo must come after
}
解决方法:
JVM没有编译类,javac也没有.
事实上,JVM基本上不了解任何形式的内部类 – 它们被编译为单独的类,JVM以这种方式处理它们.所有内部类功能都是由编译器生成的swizzle完成的(除非自Java 5以来这已经改变). (而且我一直怀疑有这样的安全漏洞,但从来没有费心去尝试找到它们.)
如果在多个方法中包含完全相同的类,我不知道编译器是否以某种方式确定它们是相同的,只生成一个副本,或者它是否生成多个副本.一些简单的测试会告诉你.
内部方法无疑已经(相对容易)在Java中实现,但设计人员选择避免Java 1的复杂性(特别是考虑到他们的模型是C),然后将所有精力投入到内部类中.我怀疑,没有真正的理由,其他它不会成为任何人的宠物想法.
[实际上,有一个原因是没有实现内部类,但不是一个不可逾越的内部类.如果没有“显示”和一些额外的操作码,原始的Java执行堆栈模型就不会支持它,而且,由于这个原始设计,Java设计人员非常不愿意向JVM添加甚至明显需要的新功能(正如JVM所见)没有JVM模型的内部类的实现). (但奇怪的是,他们在5.)中实现了对验证的高度不兼容和普遍(并且可能是不必要的)更改.)]
内容总结
以上是互联网集市为您收集整理的一个METHOD中的Java Local Inner Class,它是如何由JVM处理的?全部内容,希望文章能够帮你解决一个METHOD中的Java Local Inner Class,它是如何由JVM处理的?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。