JMU
Visibility
in Detailed Design


Prof. David Bernstein
James Madison University

Computer Science Department
bernstdh@jmu.edu


Overview
Visibility
Types of Visibility
Block Entity is (created and) accessible within a block of code
Subprogram Entity is accessible within a subprogram (e.g., local variables; parameters passed by value
Referential Visibility is temporarily provided to another entity (e.g., parameters passed by reference)
Class/File Entity is visible to all entities within a class/file (e.g., private variables in Java; static variables in C)
Types of Visibility (cont.)
Generalized Entity is accessible to its class and all extensions (e.g., protected variables in Java)
Group Entity is accessible to all members of a pre-defined group (e.g., package visibility in Java, COMMON blocks in FORTRAN)
Complete Entity is visible everywhere (e.g., public variables in Java; global variables)
Notation
Rules of Thumb
Visibility in Java
Visibility in Java (cont.)

An Example

javaexamples/datahiding/Node.java
        package datahiding;


/**
 * A Node (containing a String) in a Queue
 *
 * @version 1.0
 * @author  Prof. David Bernstein, James Madison University
 */
public class Node
{
    // These attributes have package visibility
    String    value;
    Node      next;
}
        
javaexamples/datahiding/Queue.java
        package datahiding;


/**
 * A Queue (of String objects)
 *
 * @version 1.0
 * @author  Prof. David Bernstein, James Madison University
 */
public class Queue
{
    private Node back, front;


    /**
     * Construct a new (empty) Queue
     */
    public Queue()
    {
       front = null;
    }


    /**
     * Pop a String off of the front of this Queue
     *
     * @return  The String on the front of this Queue
     */
    public String pop()
    {
       String  value;


       if (front != null) 
       {
          value = front.value;
          front = front.next;
       } 
       else
       {
          value = null;
       }
       return value;
    }


    /**
     * Push a String onto the back of this Queue
     *
     * @param s   The String to push
     */
    public void push(String s)
    {
       Node temp;

       temp = new Node();
       temp.value = s;
       temp.next = null;

       if (front == null)
       {
          front = temp;
       }
       else
       {
          back.next = temp;
       }

       back = temp;
    }
}
        
javaexamples/datahiding/Example.java
        package datahiding;

/**
 * An example that uses a simple Queue
 *
 * @version 1.0
 * @author  Prof. David Bernstein, James Madison University
 */
public class Example
{


    public static void main(String[] args)
    {
       Queue            q;
       String           poppedOff, userInput;


       q = new Queue();
       q.push("I");
       q.push("love");
       q.push("CS349");


       System.out.println("\n\nHere's what was on the Queue:\n");

       while ((poppedOff = q.pop()) != null)
       {
          System.out.println(poppedOff);
       }
    }

}
        

javaexamples/datahiding/WillNotCompile.java
        import datahiding.Node;


/**
 * An example that illustrates package visibility
 *
 * Note: This class is not part of the example2 package.
 *       As a result, Node.value is not visible to this
 *       class (since it has package visibility).
 *
 * @version 1.0
 * @author  Prof. David Bernstein, James Madison University
 */
public class WillNotCompile
{
    Node   n = new Node();    
    String s = n.value;

}