% find . -name "*.java" -print0 |xargs -0 cat []
public class Main {
public static void main(String[] args) {
Printable p = new PrinterProxy("Printer");
p.setPrintName("Alice");
System.out.println(p.getPrinterName());
p.setPrintName("Bob");
p.print("日本語");
}
}
public interface Printable {
void setPrintName(String name);
String getPrinterName();
void print(String string);
}
public class Printer implements Printable {
private String name;
public Printer() {
heavyJob("Printerのインスタンスを生成中");
}
public Printer(String name) {
this.name = name;
heavyJob("Printerのインスタンスを生成中");
}
private void heavyJob(String string) {
System.out.println(string);
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
System.out.println(".");
} catch (Exception e) {
}
}
System.out.println("完了");
}
@Override
public void setPrintName(String name) {
this.name = name;
}
@Override
public String getPrinterName() {
return name;
}
@Override
public void print(String string) {
System.out.println("==== " + name + " ====");
System.out.println(string);
}
}
public class PrinterProxy implements Printable {
private String name;
private Printable real;
private String className;
public PrinterProxy() {
}
public PrinterProxy(String className) {
this.className = className;
}
@Override
public synchronized void setPrintName(String name) {
if (real != null) {
real.setPrintName(name);
}
this.name = name;
}
@Override
public String getPrinterName() {
return name;
}
private synchronized void realize() {
if (real == null) {
try {
@SuppressWarnings("rawtypes")
Class clazz = Class.forName(className);
real = (Printable) clazz.newInstance();
real.setPrintName(name);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
@Override
public void print(String string) {
realize();
real.print(string);
}
}
Alice
Printerのインスタンスを生成中
.
.
.
.
.
完了
==== Bob ====
日本語