Bei der Arbeit mit Java von Scala müssen wir null berücksichtigen.Java-Getter aktivieren Java-Getter
HttpServletRequest getters (getAttribute, getHeader, etc.) zum Beispiel, alle möglicherweise Null zurückgeben.
Ich weiß, dass ich bei jedem Aufruf einer HttpServletRequest-Methode manuell eine Vorgangs-/Zuordnungsoperation durchführen kann, aber das ist ein bisschen mühsam. Auch Methodenaufrufe wie request.getHeader ("Accept-Encoding") sind ein Biss.
kam ich mit einer Anreicherung auf beide Fragen zu behandeln:
class Servlet_Request_Provides_NullSafe_Getters (r: HttpServletRequest) {
def header(s: String) = Option(r.getHeader(s))
def attrib(s: String) = Option(r.getAttribute(s))
def remoteHost = Option(r.getRemoteHost)
def accepts = header("Accept-Encoding")
}
implicit def request2Option(r: HttpServletRequest) =
new Servlet_Request_Provides_NullSafe_Getters(r)
1) Gibt es einen anderen/besseren Weg, als bereichern-my-Bibliothek die gleiche/ähnliche beeinflussen zu erreichen?
2) Wenn dies der "Weg" ist, was sind die Auswirkungen auf die Leistung/Risiken? Mit anderen Worten, kann man sich durch den scheinbaren Nutzen/Nutzen dieses Musters verbrennen?
Entschuldigung, wenn dieses Zeug offensichtlich ist, begann gerade neulich Bereicherung, und es scheint wirklich ziemlich nützlich. wollen nur sicherstellen, dass ich das Muster in den richtigen Szenarien bin Anwendung ... darauf hingewiesen
EDIT
@dhg dass Option.apply() und:
def safe[T](v: T) = v match {
case null => None
case x => Some(x)
}
äquivalent sind, so die Getter-Methoden jetzt Option (f()) anstelle meines Fremd sicher (f()) Wrapper
Dank
BTW: Ihre 'sichere' Methode kann durch' Option.apply' ersetzt werden. Zum Beispiel: 'Option (5)' ergibt 'Some (5)' und 'Option (null)' ergibt 'None'. – dhg
+1 schön, das ist cool, wusste das nicht. Typ beibehalten auch, ich liebe diese Sprache ;-) – virtualeyes
In der entgegengesetzten Richtung, wenn Parameter API-Aufrufe, die Null von Option [T] zu T (wobei T kann Null sein) Null sein können, verwenden Sie Option.oderNull, aber denken Sie daran, ist dies nicht er selbe wie Option.getOrElse (null), da es auf T beschränkt ist <: AnyRef –