2012-04-06 15 views
3

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

+10

BTW: Ihre 'sichere' Methode kann durch' Option.apply' ersetzt werden. Zum Beispiel: 'Option (5)' ergibt 'Some (5)' und 'Option (null)' ergibt 'None'. – dhg

+1

+1 schön, das ist cool, wusste das nicht. Typ beibehalten auch, ich liebe diese Sprache ;-) – virtualeyes

+1

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 –

Antwort

4

Wie bereits in den Kommentaren erwähnt verwenden:

def safe[T](v: T) = Option(v) 

Option(v) entspricht:

v match { 
    case null => None 
    case x => Some(x) 
} 

Auch die safe Verfahren unnötig öffentlichen und ein Teil der Klasse ist. Ich würde vorschlagen, es einfach einzubinden.

2) Wenn dies der "Weg" ist, was sind die Auswirkungen auf die Leistung/Risiken?

allgemeine Anpassung Java Legacy-APIs Option zu nutzen, ist eine gute Idee. Ich mache das oft mit EntityManager.find(), die null zurückgeben kann.

Ihre implizite Konvertierung ist auch in Ordnung. Verwenden Sie jedoch keine Unterstriche in Klassennamen, Java/Scala-Namenskonventionen bevorzugen CamelCase.

+0

k, auf der rechten Spur dann. re: Unterstriche in Klassennamen, der einzige Ort, an dem ich sie verwende, ist hier, in gepimpten Klassen, da der Klassenname SomeApiProvidesSomeExtraFunctionality für mich nicht so lesbar ist wie die Unterstreichungsversion – virtualeyes