[JAVA] J'ai écrit un modèle de conception en kotlin, édité par Iterator

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. Tout d'abord, je vais résumer Iterator.

Qu'est-ce que Iterator

C'est un modèle qui scanne les éléments d'un ensemble tel que List dans l'ordre depuis le début, ce qui signifie «répétiteur» en japonais.

Interface agrégée

L'interface Agreagate a le rôle d'agrégat qui peut être compté. L'interface n'est pas héritée, mais a pour rôle de forcer la méthode à être implémentée.

Aggregate.java


interface Aggregate {
	public abstract Iterator iterator(); 
}

Aggregate.kt


interface Aggregate {
    fun iterator(): Iterator
}

Interface d'itérateur

Une interface qui a une méthode de manipulation des éléments car elle joue un rôle dans le comptage des éléments Ici, le mouvement de la méthode suivante est important, et il est nécessaire d'acquérir l'élément et d'avancer l'index pour que l'élément suivant puisse être acquis. De plus, après avoir reçu un examen de cette interface Iterator, il a été dit que le type Object en Java est équivalent à Any? In Kotlin. La différence entre Any et Any? Est de savoir s'il faut ou non autoriser Null, et l'API a été modifiée pour permettre à Null d'autoriser diverses implémentations.

Iterator.java


interface Iterator {
	public abstract boolean hasNext();
	public abstract Object next();
}

Iterator.kt


interface Iterator {
    fun hasNext(): Boolean
    fun next(): Any?
}

Classe de membre

Créez une classe qui sera récupérée en tant qu'élément. Avec kotlin, vous pouvez l'obtenir avec member.name sans implémenter getter / setter.

Member.java


class Member {
	private String name;
	public Member(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}

Member.kt


class Member(val name: String)

Classe du personnel

Créez une classe Staff en tant qu'implémentation d'Agrégat et faites de la classe Staff une collection de Members. Implémentez la méthode Iterator définie dans l'interface.

Staff.java


class Staff implements Aggregate{
	private Member[] members;
	private int last;
	
	public Staff(int maxsize) {
		this.members = new Member[maxsize];
	}

	public Member getMemberAt(int index) {
		return members[index];
	}
	public void appendMember(Member member) {
		this.members[last] = member;
		last++;
	}
	public int getLength() {
		return last;
	}
	public Iterator iterator() {
		return new StaffIterator(this);
	}
}

Staff.kt


class Staff internal constructor(private val maxSize: Int): Aggregate {
    private val members: Array<Member?> = arrayOfNulls(maxSize)
    private var last: Int = 0

    fun getMemberAt(index: Int): Member? = members[index]

    fun appendMember(member: Member) {
        members[this.last] = member
        this.last++
    }

    fun getLength():Int = this.last

    override fun iterator(): Iterator = StaffIterator(this)
}

Classe StaffIterator

Créez la classe StaffIterator en tant qu'implémentation d'Iteraltor et implémentez les méthodes afin que Staff puisse être analysé. Dans la méthode suivante, l'élément est acquis et l'index est avancé au suivant, et il a le rôle de i ++ dans la syntaxe For. De plus, j'ai autorisé Null en utilisant la méthode suivante C Any? De l'interface Iterator, mais je n'avais pas l'intention de renvoyer l'objet membre comme null, j'ai donc défini Any, qui est Non-Null, comme valeur de retour.

StaffIterator.java


class StaffIterator implements Iterator{
	private Staff staff;
	private int index;
	public StaffIterator(Staff staff) {
		this.staff = staff;
		this.index = 0;
	}
	public boolean hasNext() {
		if(index < staff.getLength()) {
			return true;
		}else {
			return false;			
		}
	}
	public Object next() {
		Member member = staff.getMemberAt(index);
		index++;
		return member;
	}
}

StaffIterator.kt


class StaffIterator(private val staff: Staff): Iterator {
    private var index: Int = 0
    override fun hasNext(): Boolean = index < staff.getLength()

    override fun next(): Any {
        val member: Member = staff.getMemberAt(index) as Member
        index++
        return member
    }
}

Classe principale

Il s'agit de la classe Main qui exploite en fait la classe ci-dessus. Le point ici est que la mise en œuvre de Staff n'interfère pas avec la déclaration while.

IteratorSample.java


public class IteratorSample {
	public static void main(String[] args) {
		Staff staff = new Staff(3);
		staff.appendMember(new Member("sato"));
		staff.appendMember(new Member("suzuki"));
		staff.appendMember(new Member("saito"));
		Iterator it = staff.iterator();
		while(it.hasNext()) {
			Member member = (Member)it.next();
			System.out.println(member.getName());
		}
	}
}

IteratorSample.kt


fun main(args: Array<String>){
    val staff = Staff(3).apply {
        appendMember(Member("sato"))
        appendMember(Member("suzuki"))
        appendMember(Member("saito"))
    }
    val it: Iterator = staff.iterator()
    while (it.hasNext()) {
        val member: Member = it.next() as Member
        println(member.name)
    }
}

Résultat d'exécution


sato
suzuki
saito

Diagramme de classe

image.png

Impressions

Problème 1-1

Changement du tableau de classe de personnel en Vector. À la suite de sa mise en œuvre, j'ai pu confirmer que la gamme d'influence du changement se situait au sein de la classe du personnel et j'ai appris l'importance d'une faible dépendance.

package practice.design_pattern_java;

import java.util.Vector;

interface Aggregate {
	public abstract Iterator iterator(); 
}

interface Iterator {
	public abstract boolean hasNext();
	public abstract Object next();
}

class Member {
	private String name;
	public Member(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}

class StaffIterator implements Iterator{
	private Staff staff;
	private int index;
	public StaffIterator(Staff staff) {
		this.staff = staff;
		this.index = 0;
	}
	public boolean hasNext() {
		if(index < staff.getLength()) {
			return true;
		}else {
			return false;			
		}
	}
	public Object next() {
		Member member = staff.getMemberAt(index);
		index++;
		return member;
	}
}

class Staff implements Aggregate{
	private Vector<Member> members = new Vector<Member>();
	private int last;

	public Member getMemberAt(int index) {
		return members.get(index);
	}
	public void appendMember(Member member) {
		this.members.addElement(member);;
		last++;
	}
	public int getLength() {
		return last;
	}
	public Iterator iterator() {
		return new StaffIterator(this);
	}
}

public class IteratorVectorSample {
	public static void main(String[] args) {
		Staff staff = new Staff();
		staff.appendMember(new Member("sato"));
		staff.appendMember(new Member("suzuki"));
		staff.appendMember(new Member("saito"));
		Iterator it = staff.iterator();
		while(it.hasNext()) {
			Member member = (Member)it.next();
			System.out.println(member.getName());
		}
	}
}

référence

Il était très facile à lire et à comprendre en se référant à ce qui suit.

Introduction à Kotlin pour les programmeurs Java

Pour Kotlin's Any, je me suis référé à ce qui suit. Là où les programmeurs Java ont tendance à trébucher sur Kotlin

Recommended Posts

J'ai écrit un modèle de conception en kotlin, édité par Iterator
J'ai écrit un modèle de conception dans l'édition Kotlin Singleton
J'ai écrit un modèle de conception dans l'édition Kotlin Adapter
J'ai écrit un modèle de conception dans l'édition de modèle kotlin
J'ai écrit un modèle de conception dans l'édition Kotlin Prototype
Apprenez le modèle de conception "Iterator" avec Python
Un mémo que j'ai écrit un tri rapide en Python
J'ai écrit une classe en Python3 et Java
J'ai écrit un analyseur japonais en japonais en utilisant pyparsing.
Modèle d'itérateur en Java
J'ai écrit python en japonais
J'ai écrit un script pour obtenir un site populaire au Japon
J'ai écrit un script qui divise l'image en deux
J'obtiens un UnicodeDecodeError avec mecab-python3
J'obtiens une KeyError dans pyclustering.xmeans
J'ai écrit une fonction pour charger le script d'extension Git en Python
J'ai écrit Fizz Buzz en Python
J'ai écrit Gray Scale avec Pytorch
J'ai écrit un script pour extraire les liens de pages Web en Python
J'ai écrit la file d'attente en Python
J'ai participé à AtCoder (édition ABC169)
J'ai écrit la pile en Python
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
[Python] J'ai écrit de force une courte fonction de génération de bruit parlin dans Numpy.
J'ai écrit FizzBuzz en python en utilisant la machine à vecteurs de support (bibliothèque LIVSVM).
Apprenez le modèle de conception "Builder" avec Python
Je veux imprimer dans la notation d'inclusion
Apprenez le modèle de conception "Flyweight" en Python
J'ai fait un programme de gestion de la paie en Python!
Apprenez le modèle de conception "Observer" en Python
Apprenez le modèle de conception "Memento" avec Python
Apprenez le modèle de conception "Proxy" en Python
Apprenez le modèle de conception "Visiteur" avec Python
Apprenez le modèle de conception "Bridge" avec Python
Apprenez le modèle de conception "Mediator" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
Tri sélect écrit en C
Apprenez le modèle de conception «Stratégie» avec Python
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "État" en Python
J'ai écrit Project Euler 1 en une seule ligne.
Apprenez le modèle de conception "Adapter" avec Python
Démarrage de Node.js dans un environnement virtuel
J'ai créé un outil de mot de passe en Python.
J'ai écrit l'aile coulissante dans la création.
J'ai écrit un graphe comme R glmnet en Python pour une modélisation clairsemée avec Lasso
J'ai écrit un module PyPI qui étend le style de paramètre dans le module sqlite3 de Python
Quand j'obtiens une erreur de pilote chrome dans Selenium
Apprenez le modèle de conception "Abstract Factory" avec Python
Apprenez le modèle de conception "Méthode de modèle" en Python
Je veux créer une fenêtre avec Python
J'ai essayé de jouer à un jeu de frappe avec Python
Apprenez le modèle de conception "Méthode d'usine" en Python
J'ai écrit "Introduction à la vérification des effets" en Python
J'ai écrit un script pour télécharger un plug-in WordPress
J'ai essayé d'ajouter un module Python 3 en C
[PyTorch] J'étais un peu perdu dans torch.max ()
Créer un modèle d'antenne cadre en Python dans KiCad
J'ai fait un simple lecteur RSS ~ Edition C ~