2011-01-11 16 views
14

He leído que no hay paquete privado (predeterminado en Java) en scala y uso el acceso público de forma predeterminada.Acceso público predeterminado en scala

¿Cuáles son los motivos de esta elección? ¿Es una buena práctica que el acceso público predeterminado haga que todo sea visible, por lo tanto, parte de la API?

Esto significa tipeo extra para encapsular los campos y métodos (ya sea privado, ámbito privado, protegido, acceso).

Respuesta

2

Esto es algo que le da a mucha gente algunos problemas. Sugiero dar una entrada a this (en realidad toda la serie).

La inmutabilidad también previene cualquiera de los divertidos que generalmente ocurren con dicho acceso. Puede ser cierto que "hay más tipeo", pero al mirar los IDE, son responsables de una gran cantidad de fud ya que cualquier método generado por el IDE suele ser público, lo que tampoco siempre es válido.

1

Según Programming Scala, parece que el público predeterminado es debido principalmente a la uniform access principle, donde la sobrecarga de operadores permite que uno defina el comprador como field = newvalue

+0

bien ... realmente leo aquí (http://joelabrahamsson.com/entry/learning-scala-uniform-access-principle) que el compilador inserta un getter para un acceso uniforme.Sin embargo, el acceso es público. – bsr

+0

Para un principio de acceso uniforme, debería bastar con que los niveles de acceso predeterminados para campos y métodos sean iguales, no es necesario que ambos sean 'públicos '. –

25

En Java es mucho más fácil elegir 'paquete-privado' como el predeterminado porque es una de las tres posibilidades allí.

En Scala se puede elegir entre el acceso público (public), acceso a paquetes-privada con la herencia (protected[C]), acceso a paquetes-privada sin herencia (private[C]), el acceso de clase-privada (private), acceso privado a objetos (private[this]), acceso a herencia (protected), protected[this] acceso (como lo llame) y, adicionalmente, tiene algún tipo de modificador de acceso de archivo privado (sealed).

Es difícil seleccionar un valor por defecto distinto de public.

(Teniendo en cuenta los métodos internos, también se podría añadir método privada a la lista ...)

+1

Has planteado un punto válido, aún así diría que, aunque scala da más y mejor opción (coherencia en el ámbito protegido), el valor predeterminado debería ser algo que oculte la implementación. En ese sentido, el paquete privado de acceso sin herencia (privado [C]) en su estado de cuenta. No me importa escribir extra y estoy de acuerdo en que es fácil con IDE, todavía me pregunto cuál es la razón de ser de la elección. – bsr

+0

Pero, ¿con qué frecuencia necesitarías 'private [C]'? Y también, dado que puede anidar paquetes, ¿qué paquete o clase sería 'C'? Lo más externo sería inútil, lo más interno sería la clase donde se define el miembro, por lo que sería simplemente 'privado '. Sigue siendo una opción válida por supuesto; es especialmente el paquete lo que se vuelve complicado. – Debilski

+0

Pero bueno, es difícil discutir de todos modos porque es así y no es tan malo como podría parecer. – Debilski

5

Scala tiene mucha más flexibilidad en la elección de la visibilidad de algo que Java, aunque algunos de reglas de visibilidad Java, relacionado con las clases anidadas no se pueden traducir a Scala.

Y, sí, hay paquetes privados en Scala. Está escrito como private[package] en Scala.

La razón por la que Scala hace public es la predeterminada porque es la visibilidad más común utilizada. La "escritura extra" es en realidad menos escribiendo, porque es mucho más raro hacer que los miembros sean privados o estén protegidos.

Una excepción a esa regla en Java son los campos, que deben hacerse privados para que uno pueda cambiar los detalles de la implementación sin romper clientes. Una consecuencia práctica de esto son las clases con campos y luego getters y setters para cada campo.

En Scala, porque uno puede reemplazar un val o un var con el def correspondiente, esto no es necesario.

+0

'es mucho más raro hacer que los miembros sean privados o estén protegidos' puede ser cierto para atributos con getters y/o setters, pero no estoy de acuerdo en el caso general. Hay muchos más detalles de implementación privada que API pública, porque la API expone métodos de nivel superior – Dici

Cuestiones relacionadas