Java或其他任何使用此功能的語言中的本地類的優點是什麼?本地類的好處Java
17
A
回答
10
它們允許您從父類中取出邏輯並將其對象化。這將功能從它不屬於的地方移除,並將其放入它自己的類中。但是如果這個新對象只需要很短的時間,只需要一段代碼的時間呢?那麼,這就是本地課程適合的地方。
24
下面是一個如何在程序中存在匿名內部類,本地內部類和常規內部類的示例。該示例查看MyClass
類中存在的myMethod
方法和InnerClass
類。爲了討論的方便,這些類都將實施Runnable
接口:
public class MyClass
{
public void myMethod()
{
// Anonymous inner class
Runnable r = new Runnable() {
public void run() {}
};
// Local inner class
class LocalClass implements Runnable
{
public void run() {}
}
}
// ... //
// Inner class
class InnerClass implements Runnable
{
public void run() {}
}
}
的匿名內部類可用於單純爲了實現Runnable
一類,而不必實際寫出來的類命名它,並且如他的帖子中提到的krosenvold,它被用作Java中的「窮人封閉」。
例如,一個非常非常簡單的方法來使用匿名內部類將是啓動一個Thread
:
new Thread(new Runnable() {
public void run()
{
// do stuff
}
}).start();
一種本地內部類可以用來使一個類是本地範圍內 - 將不能通過myMethod
以外的其他方法訪問。
如果有另一種方法,我們試圖使位於該myMethod
方法裏面LocalClass
的一個實例,我們將不能夠這樣做:
public void anotherMethod()
{
// LocalClass is out of scope, so it won't be found,
// therefore can't instantiate.
new Thread(new LocalClass()).start();
}
的內部類是內部類所在類的一部分。因此,例如,內部類InnerClass
可以通過MyClass.InnerClass
從其他類訪問。當然,這也意味着MyClass
中的另一種方法也可以實例化一個內部類。
public void anotherMethod()
{
// InnerClass is part of this MyClass. Perfectly instantiable.
new Thread(new InnerClass()).start();
}
關於匿名內部類和局部內部類的另一件事情是,這將能夠訪問它們在myMethod
聲明final
變量:
public void myMethod()
{
// Variable to access from anonymous and local inner classes.
final int myNumber = 42;
// Anonymous inner class
Runnable r = new Runnable() {
public void run()
{
System.out.println(myNumber); // Works
}
};
// Local inner class
class LocalClass implements Runnable
{
public void run()
{
System.out.println(myNumber); // Works
}
}
// ... //
那麼,有哪些優勢?使用匿名內部類和本地內部類而不是單獨成熟的內部類或類將允許前者在聲明它們的方法中訪問final
變量,並且同時這些類是局部的該方法本身,所以它不能從同一個類中的外部類和其他方法訪問。
12
你可以用本地類來做很多事情,但是你不會用匿名內部類獲得。
- 因爲類型有一個名字,你可以更有效地添加成員不會在超
- 給定的名稱可以使堆棧跟蹤更容易理解(特別是鎖定的對象)
- 亞型多個基請在多個地方
- 結構,以及多個構造
在另一方面,他們做出一些令人髮指的詳細的語法甚至混亂。
相關問題
- 1. Java中的方法本地內部類提供了什麼好處?
- 2. 良好的Java本地化框架
- 3. 有沒有更好的方式在C++中實現Java類本地類?
- 4. Java本地類和接口
- 5. Java拋出RuntimeException的好處
- 6. libGDX Array類好處
- 7. 在java中的本地類的對象?
- 8. Tomcat本機庫的好處
- 9. 良好地處理異常
- 10. 瞭解Java中的本地類
- 11. Java的好奇心:在類
- 12. 是否真的比靜態更好地處理動態類?
- 13. Java中的靜態類有什麼好處?
- 14. python類有什麼好處?
- 15. 更好地在Java或Javascript中處理JSON?
- 16. 很好地處理空值的語法
- 17. 最好的地方,把數據包類java
- 18. Java類之間的消息傳遞如何最好地完成?
- 19. JAXB:使用本地schemaLocation生成Java類
- 20. Java異常處理的良好做法
- 21. Java-RAM&靜態變量的好處
- 22. Java InitialDirContext()的用途/好處是什麼?
- 23. 反彙編Java JIT編譯好的本地字節碼
- 24. 如何更好地處理依賴於模板參數的類成員類型?
- 25. 如何在一個類中最好地處理一堆引用
- 26. 在Java中調用一個類作爲ArrayList有什麼好處?
- 27. 爲Java而不是JMS使用WebSphere MQ類有什麼好處?
- 28. 從xml動態生成java bean類有什麼好處?
- 29. 哪一個更好地處理版本控制? XmlSerializer與DataContractSerializer?
- 30. C#7本地函數相比lambdas有什麼好處?
這不是對象實例的持續時間,而是它的範圍。 如果該類只需要對父類可見,那麼使其成爲本地將阻止它在其他地方使用。此外,本地班級可以看到父母的私人成員 - 非本地班級無法做到這一點。 – belugabob 2009-01-26 08:27:55
@belugabob:1.本地類只能在定義它們的方法或構造函數內使用。他們甚至對封閉的班級都不可見。 2.嵌套/內部類也可以看到封閉類的私有變量。 – 2009-01-26 15:33:53