我正在回顾java中内部类的概念.到目前为止,我已经理解和应用java内部类有一个链接或访问其外部/封闭类的方法和字段.
我的问题:
Java中常用内部类吗?这些是否与嵌套类相同?或者用Java更换这些更好的东西?我有一本关于版本5的书,它有一个使用内部类的例子,但我想我读过一些内部类是"坏的".
我不知道,并希望有关于它的想法.
谢谢.
对于简单的内部类有一些不同的看法,所以我想知道对什么是好的以及何时使用私有内部类有一个普遍的共识.
这是我发现的一个例子,我认为没有必要创建一个内部类.这有多好/坏?
private static class InternalCounter {
int count;
public InternalTabManager() {
count = 0;
}
public int increment() {
return count++;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,在这种特殊情况下,一个实例保留在周围的类中以跟踪计数.
我试图理解在Java中扩展内部类.我已经阅读过,但没有找到我的问题.所以这里......
我有...
public class Pie{
protected Slice[] slices;
// Pie constructor
public Pie(int n){
sliceGenerator(n)
}
private void sliceGenerator(int n){
slices = new Slice[n];
final float sweepAngle = 360.0f/(float)n;
float startAngle = 0;
for (int i=0;i<n;i++){
slices[i] = new Slice(startAngle);
startAngle += sweepAngle;
}
}
@Override
public String toString(){
for (Slice s:slices){
s.toString();
}
}
// Inner class...
public class Slice{
public Slice(float startAngle){
//set some private fields based on startAngle and generic pie
}
@Override
public String toString(){
return …Run Code Online (Sandbox Code Playgroud) ===结论====
找到一个很好的阅读https://softwareengineering.stackexchange.com/a/149569其中规定
当前的GC算法实际上是为了创建许多短暂的小对象而优化的. 所以我认为在项目中使用匿名内部类对于性能来说不是什么大问题*
================================================== ======================
因为函数不是当前Java(Java7)中的第一类公民,所以使用匿名内部类似乎是实现完整异步应用程序的唯一方法.
我知道它会在一定程度上带来更大的内存占用和垃圾收集器负担,但我不知道它有多严重?最近我的同事和我争论是因为我的代码是通过利用匿名内部类来编写的,他的反对意见完全取决于性能.虽然我不同意,但我不能举出任何证明自己的例子.我知道groovy正在使用匿名类实现闭包,但是groovy的性能比java差(当然匿名应该只承担部分责任,因为groovy也大量使用反射).
所以我想在现实世界中,有没有任何项目因为性能而放弃匿名课程?像swing这样的UI框架怎么样?是否大量使用匿名类?
没有匿名,我无法想象如何在java中优雅地实现异步.我们的项目已经使用一种非常丑陋的方式使类方法作为函数指针工作.我讨厌那么多,并想说服人们匿名上课是正确的方法.
我的例子:
// basically, I use Completion interface to make normal java methods work in async manner
public interface Completion {
void success();
void fail(String reason);
}
void methodA(Completion completion) {
do_some_business_by_calling_remote_service ....
when remote_service_ack_success:
completion.success();
else:
completion.fail(remote_service_error);
}
void methodB() {
methodA(new Completion() {
public void success() {
continue to do something;
}
public void fail(String err) {
handle error
}
});
}
Run Code Online (Sandbox Code Playgroud)