Pour apprendre le concept d'interface et la réutilisabilité des objets, qui sont importants dans l'orientation des objets ["Introduction aux modèles de conception appris en langage Java"](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 & mots-clés = 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 J'ai appris à propos de% 85% A5% E9% 96% 80 & qid = 1559563427 & s = gateway & sr = 8-1) et j'ai décidé d'écrire en kotlin pendant que j'étais en Java. Cette fois, j'écrirai sur Prototype.
Un modèle qui utilise une classe lors de la création d'une instance, mais copie une instance existante et la duplique comme une autre instance.
Il y a des mérites dans les cas suivants.
- Lorsqu'il y a trop de types à rassembler dans une classe
En outre, l'exemple de code fournit un modèle pour créer une nouvelle instance basée sur l'instance prototype.
Une instance d'une sous-classe qui hérite de la classe Product dans une interface qui hérite de Cloneable est la classe à copier.
Dans Kotlin, si Cloneable est implémenté dans l'interface du produit, ce sera java.lang.NoClassDefFoundError
. Apparemment, il ne peut pas être implémenté dans une interface, et ce doit être une classe qui hérite de Cloneable.
Nous avons également confirmé qu'il pouvait être implémenté dans le cas d'une sous-classe d'une classe abstraite qui hérite de Cloneable.
Référence: Modèle de conception avec le prototype Kotlin 06 Design Model-kotlin-Recovery Prototype
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
}
Pour la classe de résumé de produit
Product.kt
abstract class Product(): Cloneable {
abstract fun use(s: String)
abstract fun createClone(): Product
}
C'est une classe qui duplique une instance en utilisant createClone, et si vous l'enregistrez, ce sera une classe qui peut être dupliquée à tout moment.
HashMap peut être obtenu avec showcase.get ()
ou showcase []
.
Dans kotlin, val a: String = null
provoque une erreur de compilation et Null n'est pas autorisé par défaut. Si vous spécifiez ?, Null peut être géré. De plus, si le p spécifié est Null, createClone n'est pas exécuté et Null est renvoyé.
Référence: [Kotlin] [Java] Mémo de comparaison Kotlin Java [Null Safety] Kotlin Java Comparison Memo Correct Null Safety Usage Essayez «Introduction aux modèles de conception appris en langage Java» avec Kotlin (prototype)
@htsign Merci pour votre avis.
À l'origine, je voulais déclarer une variable p de type Product en dehors du bloc de l'instruction try dans la sous-classe de Product
J'ai assigné Null
et spécifié?
, Mais je l'ai modifié pour retarder l'initialisation en utilisant lateinit
et je l'ai corrigé pour qu'il ne gère pas Null.
Ainsi, createClone ()
de l'interface Product
renvoie également la valeur de retour de Product?
To Product
.
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()
}
}
Gestionnaire de correctifs.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()
}
}
Cette classe affiche une chaîne de caractères entourée d'une bordure.
Le Cloneable mentionné précédemment doit être implémenté dans une sous-classe de Produit.
De plus, puisque la méthode clone ne peut être appelée qu'à partir de votre propre classe (et sous-classe), si vous voulez dupliquer à la demande d'une autre classe (Manager), appelez clone avec une autre méthode telle que createClone ()
. Il est nécessaire.
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
}
}
MessageBox modifié.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
}
}
Cette classe est affichée en soulignant la chaîne de caractères.
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
}
}
Stylo de soulignement fixe.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.")
}
Échantillon de prototype modifié.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.")
}
Résultat d'exécution
"Hello, World."
~~~~~~~~~~~~~
*****************
* Hello, World. *
*****************
/////////////////
/ Hello, World. /
/////////////////
J'ai également étudié pourquoi + clone est nécessaire en premier lieu (Référence: À propos de la méthode Java clone ()) Il a été hérité. J'ai appris que la méthode de clonage a été conçue pour copier l'instance telle quelle car elle se comporte involontairement lors de la création d'une instance dans une sous-classe ou autre.
String # getBytes
with toByteArray ()
shallow copy
(la valeur de référence est copiée à la place de la valeur de référence de la destination du champ), donc si vous réécrivez le champ de l'instance, vous pouvez involontairement réécrire le champ source du clone, doncdeep copy J'ai appris qu'il est nécessaire de remplacer et d'ajouter un traitement lorsque
(copie à la valeur de la destination de référence de la destination du champ).C'était très facile à lire et à comprendre en se référant à ce qui suit.
Comment écrire Java String # getBytes dans Kotlin? Modèle de conception avec le prototype Kotlin 06 Design Model-kotlin-Recovery Prototype [Kotlin] [Java] Mémo de comparaison Kotlin Java [Null Safety] Kotlin Java Comparison Memo Correct Null Safety Usage Essayez «Introduction aux modèles de conception appris en langage Java» avec Kotlin (prototype)
De plus, le blog suivant expliquait en détail clone ()
, qui était une excellente expérience d'apprentissage.
À propos de la méthode Java clone ()