2010-04-15 17 views
9

¿Qué significa que un método sea público/privado/otro en java?
¿Cuáles son las ventajas y desventajas de estas opciones?
¿Cuál es mi ímpetu, como alguien que trata de ser un buen programador, para que se preocupe?¿Qué significa que un método sea público/privado/otro en Java?

+9

Sun tutorial: http://java.sun.com/docs/books/tutorial/ java/javaOO/accesscontrol.html – BalusC

+0

En segundo lugar el tutorial o un tutorial básico de OOP. Los conceptos son los mismos para todos los lenguajes de OO con respecto a la encapsulación/acceso a datos. –

+0

¿Qué significa OOP? – David

Respuesta

13

Cuando un método es público que significa que se puede acceder por otros objetos

Por ejemplo:

class David { 
    // public method, can be use by anyone 
    public String getName() { 
     return "David"; 
     } 
} 

El método getName se puede acceder por otras clases porque es público:

class Other { 
     David davidOne = new David(); 
     String davidsName = davidOne.getName(); //<-- compiles and runs 
} 

La ventaja ... bueno, puede usarlo desde otros lugares.

Cuando un método es privado que significa que sólo se puede acceder por los objetos de la misma clase

Por ejemplo, en esta nueva definición:

class David { 
    public String getName() { 
     return "David"; 
    } 
    // private method... nobody but David's "instances" can use it.. 
    private int getAge() { 
     return 19; 
    } 

} 

El método getAge puede' t ser accedido por otras clases porque es privado, si intentas hacerlo, el compilador te dará un mensaje de error:

class Other { 
     David davidOne = new David(); 
     String davidsName = davidOne.getName(); 
     int davidsAge = davidOne.getAge(); //<-- Compiler error, getAge() is not visible 
} 

Pero, si se puede usar dentro de clase David:

class David { 
    public String getName() { 
     return "David"; 
    } 
    // private method... nobody but David's "instance" can use it.. 
    private int getAge() { 
     return 19; 
    } 
    // Here the call to "getAge()" will succeed, because it is visible 
    // inside the class 
    public boolean hasSameAgeAs(David otherDavid) { 
     return this.getAge() == otherDavid.getAge(); 
    } 
} 

La ventaja? Se puede crear un montón de métodos y mantenerlos privados, evitar la corrupción de datos o, en general, la preservación de sus objetos encapsulated

Acerca de encapsulación

En OOP (Programación Orientada a Objetos) la intención es modelar el software después de bienes objetos de vida

Los objetos de la vida real tienen (entre otras cosas) atributos y métodos para acceder a esos atributos.

Quiere hacer públicos algunos de esos métodos, y mantener privados otros.

Por ejemplo, un humano siendo, tener un corazón. Pero no está expuesto a todos, sería peligroso. Es encapsulado dentro de nuestro cuerpo.

Si nos vamos a modelar un software después de un verdadero humana podemos declarar el método: heartBeat como privada (así, nadie puede acceder a él)

En el otro lado, sería útil haber llegado public métodos como getGender para averiguar si su instancia Human es masculina o femenina.

Hay otros modificadores de acceso, tales como: "protegido" y protegido paquete (cuyo no tiene una palabra clave)

class David { 
     // protected method 
     protected int getBalance() { 
      return 1000000; 
     } 
     // package protected or "default" method 
     boolean knowsOop(){ 
      return true; 
     } 
} 

Hay getBalance el método sólo puede ser accesado por David instancias y David subclases (crear otro hilo para lo que es una subclase)

El método knowsOop puede ser accesado por cualquier persona dentro del paquete como se define David.

No se preocupe por estos dos modificadores de acceso, tendrán sentido cuando obtenga más información sobre OOP y Java.

Finalmente usted debe realmente tener tiempo para leer:

http://java.sun.com/docs/books/tutorial/java/javaOO/index.html

espero que esto ayude a

0

la razón principal se llama encapsulación: no da acceso al estado interno del objeto.

+0

¿Podría entrar en más detalles? – David

+0

Un objeto puede tener estado; por ejemplo, puede tener las propiedades de colores cambiables de primer plano y fondo. Este estado se mantendría en el objeto como un valor (es) de algún tipo de variable (s). El implementador puede desear estipular restricciones sobre cómo pueden cambiar los colores (por ejemplo, ambos colores pueden no ser los mismos). Si las variables son públicas y accesibles directamente, los usuarios pueden violar la condición (también conocida como invariante), haciendo la transición del objeto a un estado no previsto/ilegal. El implementador puede, en cambio, hacer que las variables sean privadas y permitir mutaciones válidas a través de un método público. –

1

HTLos modificadores públicos, protegidos y privados controlan qué otro código puede ver esos métodos (o campos). Se trata de controlar la interfaz que estás exponiendo.

Los comúnmente útiles son:

El modificador pública: cualquier otro puede ver a su método.

El modificador privado: ningún código que no sea su clase y cualquier clase interna puede ver su método.

Esto sería útil, por ejemplo, si quisiera asegurarse de que solo se creó una sola instancia de una clase (singleton pattern). Se podría tomar la privada constructor, cree una instancia única y la tienda es como un miembro privado llamado ejemplo, y proporciona un método público algo como esto:

public static MyObject getInstance() { 
    return instance; 
} 

y lo que puede garantizar que sólo habrá cada ser una instancia .


Actualización: otro ejemplo solicitado.

Otro ejemplo podría ser donde tiene un método público complicado y desea dividirlo en partes más simples. Podría dividirlo en métodos más simples, cada uno haciendo parte del trabajo, pero no querría que otro código llamara a esos métodos de parte, ya que no funcionarían por sí solos, por lo que haría los métodos más pequeños privados, asegurando que no pueden ser llamados fuera de tu clase.

+0

¿Podrían entrar en más detalles sobre la utilidad? – David

+0

no se pudo invocar MyObject varias veces sin embargo? ¿No conduciría esto a la creación de múltiples instancias de la clase? – David

+0

No-calling MyObject.getInstance() no crea una nueva instancia, solo devuelve la que ya se creó. Las invocaciones repetidas seguirán devolviendo la misma instancia. – Brabster

1

Los métodos privados se pueden llamar solo dentro de la clase. Puede llamar al public métodos de su clase en cualquier lugar del programa. Los métodos sin el modificador de acceso tienen el alcance de visibilidad del paquete (se llama predeterminado), por lo que puede invocarlo en cualquier parte del paquete, donde se define la clase.

Ver http://en.wikipedia.org/wiki/Object_oriented_programming#Encapsulation

+0

¿cuál es mi ímpetu para hacerlo de manera que solo se pueda llamar a un método dentro de la clase? – David

+0

A veces tienes un método que solo se necesita dentro de una clase. Puede ser alguna función de conversión o cualquier otra porción de código complementario. – Dmitry

+1

No siempre es recomendable implementar una funcionalidad expuesta a través de un método público, en el cuerpo de ese método público en sí mismo. Un método público puede tener que llamar a otros métodos para ejecutar su comportamiento. Estos otros métodos están destinados para uso interno y deben marcarse como privados. –

5

Un método público se puede acceder desde todas partes, un método privado sólo de la misma clase. La principal ventaja es el control sobre la API de una clase. Si solo hago público lo que se necesita, puedo cambiar el comportamiento interno de una clase, sin romper el código según esta clase. Deberías importarte, porque el software cambia a menudo en el mundo real (al menos es mi experiencia y otros también) y cuanto más se rompa cada cambio, más energía tienes que poner en mantenimiento o más errores tiene tu software. Al final es una cuestión de costos.

La posibilidad de ocultar las partes internas de su clase a los usuarios de esta clase para evitar descifrar el código mediante cambios posteriores a menudo se denomina encapsulación o information hiding.

Las dos opciones además de pública y privada son paquete (sin un modificador) y están protegidas.El método accesible por paquetes también se puede acceder desde dentro de las clases del mismo paquete. No recuerdo haber usado esa opción de ninguna manera útil. Se puede acceder a los métodos protegidos desde las clases, que heredan la clase en cuestión. Esto se usa a menudo para crear clases con comportamiento concreto para una API definida de la clase base. Por ejemplo, podría implementar una nueva clase de lista extendiendo AbstractList y solo necesita implementar get y size (y un set-method para listas modificables). Los otros métodos expuestos por la API de List se definen en la clase base, llamando a los otros tres métodos si es necesario.

0

Para empezar, comenzaría a restringir el acceso tanto como sea posible. Comience con private. Si le sucede a necesitar el constructor, método o campo de otro lugar, pero no puede acceder a él debido a la restricción, a continuación, los pasos a seguir serían que preguntarse:

  1. Si se trata de un método, lo que realmente necesita para acceder a ella? ¿Cambia el comportamiento de la clase/instancia? ¿No deberías dejar que esa clase haga el trabajo? ¿No debería la clase actual (que necesita ese campo o método) acercarse más a esa clase?
  2. Si es un campo, ¿necesita obtener o establecer su valor? ¿No deberías agregar un método que hace exactamente eso?

El punto 1 evita el acoplamiento incorrecto y el punto 2 mejora la encapsulación. Una vez que hayas considerado lo anterior y hayas llegado a la conclusión de que es necesaria una restricción menor, dale un paso o más para abrir.

Cuestiones relacionadas