ネストしたクラスの使用
public class EnclosingClass {
...
public class NestClass {
...
}
}
ネストしたクラスは、クラスの機能の利用を制限したい場合に使用する。
public class Manager Extends Employee {
private DirectReports directReports;
public Manager () {
this.directReports = DirectReports();
}
...
private class DirectReports {
...
}
}
ネストしたpublicクラス
public class Manager exends Employee {
public Manager() {
}
...
public class DirectReports {
...
}
}
//
public static void main(String[] args) {
Manager.DirectReports dr = new Manager.DirectReports(); // won't
}
main()からDirectReportsはアクセスできない。
スコープの規則
public class Manager exends Employee {
public Manager() {
}
...
public class DirectReports {
...
}
}
//
public static void main(String[] args) {
Manager manager = new Manager();
Manager.DirectReports dr = manager.new Manager.DirectReports(); // OK
}
親クラスのインスタンスを生成し、DirectReportsをmanager(インスタンス参照変数).new
する。
静的内部クラス
public class Manager extends Employee {
...
public static class ManagerComparator implements Comparator<Manager> {
...
}
}
//
public static void main(String[] args) {
Manager.ManagerComparator mc = new Manager.Comparator();
...
}
匿名内部クラス
以下、不明
// From HumanResourcesApplication.java
public void handleStockOptions(final Person person, StockOptionProcessingCallback callback) {
if (person instanceof StockOptionEligible) {
// Eligible Person, invoke the callback straight up
callback.process((StockOptionEligible)person);
} else if (person instanceof Employee) {
// Not eligible, but still an Employee. Let's cobble up a
/// anonymous inner class implementation for this
callback.process(new StockOptionEligible() {
@Override
public void awardStockOptions(int number, BigDecimal price) {
// This employee is not eligible
log.warning("It would be nice to award " + number + " of shares at $" +
price.setScale(2, RoundingMode.HALF_UP).toPlainString() +
", but unfortunately, Employee " + person.getName() +
" is not eligible for Stock Options!");
}
});
} else {
callback.process(new StockOptionEligible() {
@Override
public void awardStockOptions(int number, BigDecimal price) {
log.severe("Cannot consider awarding " + number + " of shares at $" +
price.setScale(2, RoundingMode.HALF_UP).toPlainString() +
", because " + person.getName() +
" does not even work here!");
}
});
}
}
// JUnit test to drive it (in HumanResourcesApplicationTest.java):
@Test
public void testHandleStockOptions() {
List<Person> people = HumanResourcesApplication.createPeople();
StockOptionProcessingCallback callback = new StockOptionProcessingCallback() {
@Override
public void process(StockOptionEligible stockOptionEligible) {
BigDecimal reallyCheapPrice = BigDecimal.valueOf(0.01);
int numberOfOptions = 10000;
stockOptionEligible.awardStockOptions(numberOfOptions, reallyCheapPrice);
}
};
for (Person person : people) {
classUnderTest.handleStockOptions(person, callback);
}
}
注)匿名クラス(無名クラス)
変数 = new クラス名又はインターフェース名 {
実装
}