Наиболее тривиальный подход - это использование посыльного (Messenger) , который просто пакует информацию в объект, чтобы передать ее дальше, вместо передачи всех кусков информации наружу отдельно. Обратите внимание, что без посыльного код для метода translate() был бы более запутанный для чтения:

//: Упрощение:MessengerDemo.java
package simplifying;

import junit.framework.*;

class Point { // Посыльный
  
public int x, y, z; // Так как он просто несущий
  
  
public Point ( int x, int y, int z ) {
     
this .x = x;
     
this .y = y;
     
this .z = z;
  
}
  
  
public Point ( Point p ) { // Конструктор копирования
     
this .x = p.x;
     
this .y = p.y;
     
this .z = p.z;
  
}
  
  
public String toString () {
     
return "x: " + x + " y: " + y + " z: " + z;
  
}
}

class Vector {
  
public int magnitude, direction;
  
  
public Vector ( int magnitude, int direction ) {
     
this .magnitude = magnitude;
     
this .direction = direction;
  
}
}

class Space {
  
public static Point translate ( Point p, Vector v ) {
     
p = new Point ( p ) ; // Не изменяем оригинал
      // Выполняем расчеты, используя v. Макет расчетов:
     
p.x = p.x + 1 ;
      p.y = p.y +
1 ;
      p.z = p.z +
1 ;
     
return p;
  
}
}

public class MessengerDemo extends TestCase {
  
public void test () {
     
Point p1 = new Point ( 1 , 2 , 3 ) ;
      Point p2 = Space.translate
( p1, new Vector ( 11 , 47 )) ;
      String result =
"p1: " + p1 + " p2: " + p2;
      System.out.println
( result ) ;
      assertEquals
( result, "p1: x: 1 y: 2 z: 3 p2: x: 2 y: 3 z: 4" ) ;
  
}
  
  
public static void main ( String [] args ) {
     
junit.textui.TestRunner.run ( MessengerDemo. class ) ;
  
}
}
// /:~

 

Так как основное назначение посыльного только нести данные, эти данные сделаны публичными(public) для упрощения доступа. Однако, вы можете также иметь причины сделать эти поля их частными (private).