2016-06-24 13 views
0

Ich möchte einen Mechanismus für die Methodenvalidierung haben. Was ich suche ist:Validierung für Java-Eingabeparameter

public void someMethod(@valid String emailAddress, @valid Integer ID) { 
} 

Dies ist eine allgemeine Klasse nicht unbedingt Java Bean. Der Grund, warum ich das möchte, ist, dass ich die Validierungslogik von dieser bestimmten Klasse entkoppeln möchte.

Auch ich möchte DRY-Prinzip verwenden, das bedeutet, wenn verschiedene verschiedene Methoden die ähnlichen Parameter verwenden werden, so möchte ich weder den Aufwand duplizieren noch inkonsistenzen mit ähnlichen Arten von Eingaben einführen wollen.

Darüber hinaus möchte ich meinen Code lesbarer machen, da sonst mein Methodenkörper mit einer if/then/else-Validierungslogik gesprenkelt wird, die es schwierig macht, die tatsächliche Logik zu verstehen und unnötige Ablenkung zu verursachen.

Wenn mein Code mit etwas Logik kommentiert wurde, dann muss jemand wie der Frühling es nennen - dieser Teil, den ich denke, verstehe ich. Ich bin mir also nicht sicher, wie ich das umsetzen kann. Wird aspektorientierte Programmierung funktionieren?

+0

Sie können nachsehen, was der 'Hibernate Validator' für Sie tun kann. – Tom

+0

Sie können einen Proxy für Ihre Klasse erstellen, der die Validierung pro Parameter behandelt. Ihre Annotation kann ein Element 'Class > value() ', das auf die Validierungsklasse für diesen Parameter verweist, die von Ihrem Proxy instanziiert und getestet wird. – shmosel

+0

Ich denke, das ist genau das, was AOP kann – ZhaoGang

Antwort

2

Wenn emailAddress und ID in mehreren Methoden verwendet werden, würde ich für jede eine Klasse mit Validierungslogik in den jeweiligen Konstruktoren erstellen. Auf diese Weise können Sie garantieren, dass jede Instanz dieser Klassen gültig ist. Dann wird Ihre Methodensignatur
public void someMethod(EmailAddress emailAddress, ID id) {}.

Im Grunde ist die Wurzel Ihres Problems Strings und Primitive mit verschiedenen semantischen Bedeutung. Die einfachste Lösung besteht darin, benutzerdefinierte, sinnvolle Klassen anstelle von Strings und Primitiven zu verwenden.