Erlernen des Konzepts der Schnittstelle und der Wiederverwendbarkeit von Objekten, die für die Objektorientierung wichtig sind ["Einführung in in Java-Sprache erlernte Entwurfsmuster"](https://www.amazon.co.jp/%E5%A2%97% E8% A3% 9C% E6% 94% B9% E8% A8% 82% E7% 89% 88Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80-% E7% B5% 90% E5% 9F% 8E-% E6% B5% A9 / dp / 4797327030 / ref = sr_1_1? __Mk_ja_JP =% E3% 82% AB % E3% 82% BF% E3% 82% AB% E3% 83% 8A & Schlüsselwörter = Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6 % E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5 Ich habe% 85% A5% E9% 96% 80 & qid = 1559563427 & s = gateway & sr = 8-1) kennengelernt und mich entschieden, in Kotlin zu schreiben, während ich in Java war. Dieses Mal werde ich über Prototype schreiben.
Beim Erstellen einer Instanz basiert sie auf der Klasse, jedoch auf einem Muster, das eine vorhandene Instanz kopiert und als andere Instanz dupliziert.
In den folgenden Fällen gibt es Vorteile.
- Wenn es zu viele Typen gibt, um sie in einer Klasse zusammenzustellen
Darüber hinaus enthält der Beispielcode ein Muster zum Erstellen einer neuen Instanz basierend auf der Prototypinstanz.
Eine Instanz einer Unterklasse, die die Produktklasse in einer Schnittstelle erbt, die Cloneable erbt, ist die zu kopierende Klasse.
Wenn in Kotlin Cloneable in der Produktschnittstelle implementiert ist, lautet es "java.lang.NoClassDefFoundError". Anscheinend kann es nicht in einer Schnittstelle implementiert werden, und es muss eine Klasse sein, die Cloneable erbt. Wir haben auch bestätigt, dass es im Fall einer Unterklasse einer abstrakten Klasse implementiert werden kann, die Cloneable erbt.
Referenz: Entwurfsmuster mit Kotlin-Prototyp 06 Design Model-Kotlin-Recovery-Prototyp
Product.java
interface Product extends Cloneable {
public abstract void use(String s);
public abstract Product createClone();
}
Product.kt
interface Product {
fun use(s: String)
fun createClone(): Product
}
Für Produkt abstrakte Klasse
Product.kt
abstract class Product(): Cloneable {
abstract fun use(s: String)
abstract fun createClone(): Product
}
Es ist eine Klasse, die eine Instanz mit createClone dupliziert. Wenn Sie sie registrieren, handelt es sich um eine Klasse, die jederzeit dupliziert werden kann.
HashMap kann entweder mit "template.get ()" oder "template []" abgerufen werden.
In kotlin verursacht val a: String = null
einen Kompilierungsfehler, und Null ist standardmäßig nicht zulässig. Wenn Sie? Angeben, kann Null behandelt werden. Wenn das angegebene p Null ist, wird createClone nicht ausgeführt und Null zurückgegeben.
Referenz: [Kotlin] [Java] Kotlin Java-Vergleichsnotiz [Null-Sicherheit] Kotlin Java-Vergleichsnotiz Korrekte Verwendung der Null-Sicherheit Versuchen Sie "Einführung in in Java-Sprache erlernte Entwurfsmuster" mit Kotlin (Prototyp)
@htsign Vielen Dank für Ihre Bewertung.
Ursprünglich wollte ich eine Variable p vom Typ Product außerhalb des Blocks der try-Anweisung in der Unterklasse von Product
deklarieren
Ich habe "Null" zugewiesen und "?" Angegeben, aber ich habe es geändert, um die Initialisierung mit "lateinit" zu verzögern, und es so korrigiert, dass es nicht mit Null umgehen kann.
Das "createClone ()" der "Product" -Schnittstelle gibt also auch den Rückgabewert von "Product?" Zu "Product" zurück.
Manager.java
class Manager {
private HashMap showcase = new HashMap();
public void register(String name, Product proto) {
showcase.put(name, proto);
}
public Product create(String protoname) {
Product p = (Product)showcase.get(protoname);
return p.createClone();
}
}
Manager.kt
class Manager {
private var showcase: MutableMap<String, Product> = mutableMapOf()
fun register(name: String, proto: Product){
showcase.put(name, proto)
}
fun create(protoname: String): Product?{
val p = showcase[protoname] as Product
return p?.createClone()
}
}
Fix Manager.kt
class Manager {
private var showcase: MutableMap<String, Product> = mutableMapOf()
fun register(name: String, proto: Product){
showcase.put(name, proto)
}
fun create(protoname: String): Product{
val p = showcase[protoname] as Product
return p.createClone()
}
}
Diese Klasse zeigt eine Zeichenfolge an, die von einem Rahmen umgeben ist. Das zuvor erwähnte Klonbare muss in einer Unterklasse von Produkt implementiert werden. Da die Klonmethode nur von Ihrer eigenen Klasse (und Unterklasse) aufgerufen werden kann, rufen Sie den Klon mit einer anderen Methode wie "createClone ()" auf, wenn Sie auf Anforderung einer anderen Klasse (Manager) duplizieren möchten. Es ist notwendig.
MessageBox.java
class MessageBox implements Product {
private char decochar;
public MessageBox(char decochar) {
this.decochar = decochar;
}
public void use(String s) {
int length = s.getBytes().length;
for (int i = 0; i < length + 4; i++) {
System.out.print(decochar);
}
System.out.println("");
System.out.println(String.format("%s %s %s", decochar, s, decochar));
for (int i = 0; i < length + 4; i++) {
System.out.print(decochar);
}
System.out.println("");
}
public Product createClone(){
Product p = null;
try {
p = (Product)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
MessageBox.kt
class MessageBox(private val d: Char): Product, Cloneable{
override fun use(s: String){
val length = s.toByteArray().size
for (i: Int in 1..length + 4) print(d)
println("")
println("%s %s %s".format(d, s, d))
for (i: Int in 1..length + 4) print(d)
println("")
}
override fun createClone(): Product?{
var p: Product? = null
try {
p = clone() as Product
}catch (e:CloneNotSupportedException){
e.printStackTrace()
}
return p
}
}
Geänderte MessageBox.kt
class MessageBox(private val d: Char): Product, Cloneable{
override fun use(s: String){
val length = s.toByteArray().size
for (i: Int in 1..length + 4) print(d)
println("")
println("%s %s %s".format(d, s, d))
for (i: Int in 1..length + 4) print(d)
println("")
}
override fun createClone(): Product{
lateinit var p: Product
try {
p = clone() as Product
}catch (e:CloneNotSupportedException){
e.printStackTrace()
}
return p
}
}
Diese Klasse wird durch Unterstreichen der Zeichenfolge angezeigt.
UnderlinePen.java
class UnderlinePen implements Product {
private char ulchar;
public UnderlinePen(char ulchar) {
this.ulchar = ulchar;
}
public void use(String s) {
int length = s.getBytes().length;
System.out.println(String.format("\"%s\"", s));
System.out.print(" ");
for (int i = 0; i < length; i++) {
System.out.print(ulchar);
}
System.out.println("");
}
public Product createClone() {
Product p = null;
try {
p = (Product)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
UnderlinePen.kt
class UnderLinePen(ulchar: Char): Product, Cloneable{
private val u = ulchar
override fun use(s: String) {
val length = s.toByteArray().size
println("\"%s\"".format(s))
print(" ")
for (i: Int in 1..length) print(u)
println("")
}
override fun createClone(): Product? {
var p: Product? = null
try {
p = clone() as Product
}catch (e: CloneNotSupportedException){
e.printStackTrace()
}
return p
}
}
Fixed Underline Pen.kt
class UnderLinePen(ulchar: Char): Product, Cloneable{
private val u = ulchar
override fun use(s: String) {
val length = s.toByteArray().size
println("\"%s\"".format(s))
print(" ")
for (i: Int in 1..length) print(u)
println("")
}
override fun createClone(): Product {
lateinit var p: Product
try {
p = clone() as Product
}catch (e: CloneNotSupportedException){
e.printStackTrace()
}
return p
}
}
PrototypeSample.java
public class PrototypeSample {
public static void main(String[] args) {
Manager manager = new Manager();
UnderlinePen upen = new UnderlinePen('~');
MessageBox mbox = new MessageBox('*');
MessageBox sbox = new MessageBox('/');
manager.register("strong message", upen);
manager.register("warning box", mbox);
manager.register("slash box", sbox);
Product p1 = manager.create("strong message");
Product p2 = manager.create("warning box");
Product p3 = manager.create("slash box");
p1.use("Hello, World.");
p2.use("Hello, World.");
p3.use("Hello, World.");
}
}
PrototypeSample.kt
fun main(args: Array<String>) {
val manager = Manager()
val upen = UnderLinePen('~')
val mbox = MessageBox('*')
val sbox = MessageBox('/')
manager.register("strong message", upen)
manager.register("warning box", mbox)
manager.register("slash box", sbox)
val p1 = manager.create("strong message")
val p2 = manager.create("warning box")
val p3 = manager.create("slash box")
p1?.use("Hellow, World.")
p2?.use("Hellow, World.")
p3?.use("Hellow, World.")
}
Modifiziertes Prototyp-Beispiel.kt
fun main(args: Array<String>) {
val manager = Manager()
val upen = UnderLinePen('~')
val mbox = MessageBox('*')
val sbox = MessageBox('/')
manager.register("strong message", upen)
manager.register("warning box", mbox)
manager.register("slash box", sbox)
val p1 = manager.create("strong message")
val p2 = manager.create("warning box")
val p3 = manager.create("slash box")
p1.use("Hellow, World.")
p2.use("Hellow, World.")
p3.use("Hellow, World.")
}
Ausführungsergebnis
"Hello, World."
~~~~~~~~~~~~~
*****************
* Hello, World. *
*****************
/////////////////
/ Hello, World. /
/////////////////
Ich habe auch untersucht, warum + Klon überhaupt notwendig ist (Referenz: Über die Java-Methode clone ()) Ich habe erfahren, dass die Klonmethode so konzipiert wurde, dass die Instanz so kopiert wird, wie sie ist, da sie sich beim Erstellen einer Instanz in einer Unterklasse oder dergleichen unbeabsichtigt verhält.
Es war sehr leicht zu lesen und zu verstehen, wenn man sich auf Folgendes bezog.
Wie schreibe ich Java String # getBytes in Kotlin? Entwurfsmuster mit Kotlin-Prototyp 06 Design Model-Kotlin-Recovery-Prototyp [Kotlin] [Java] Kotlin Java-Vergleichsnotiz [Null-Sicherheit] Kotlin Java-Vergleichsnotiz Korrekte Verwendung der Null-Sicherheit Versuchen Sie "Einführung in in Java-Sprache erlernte Entwurfsmuster" mit Kotlin (Prototyp)
Außerdem erklärte der folgende Blog ausführlich über "clone ()", was eine großartige Lernerfahrung war. Informationen zur Java-Methode clone ()
Recommended Posts