 
                            ...
| Code Block | ||
|---|---|---|
| 
 | ||
| 
package Account;
import User.*;
  class AccountClass {
    private UserClass uc;  // uses a class defined in package User
    protected synchronized void depositFunds(String username, double amount) {
      // use a utility method of UserClass to check if username exists
      if(uc.exists(username)) { 
        // deposit the amount
      } 
    }
    protected double getBalance(String accountNumber) { /* return the account balance */ }
  }
package User;
import Account.*;
  class UserClass extends AccountClass {
    protected synchronized double getUserBalance(String accountNumber) {
      // use a method of AccountClass to get the account balance 
      return getBalance(accountNumber); 
    }
    public boolean exists(String username) { /* check whether user exists*/ }
  }
 | 
Compliant Solution
TODO. Outline below. Do not use DRAFT.
| Code Block | ||
|---|---|---|
| 
 | ||
| 
public interface BankApplication {   
  void depositFunds(BankApplication ba, String username, double amount);
  double getBalance(String accountNumber);
  double getUserBalance(String accountNumber);
  boolean exists(String username); 
}
class AccountClass  {	  
  public synchronized void depositFunds(BankApplication ba, String username, double amount) {	
    // use a utility method of UserClass to check if username exists
    if(ba.exists(username)) { 
      // deposit the amount
    } 
  } 
  public double getBalance(String accountNumber) { /* return the account balance */ return 1.0; }   
}
class UserClass extends AccountClass implements BankApplication {
  public synchronized double getUserBalance(String accountNumber) {
    // use a method of AccountClass to get the account balance 
    return getBalance(accountNumber); 
  }
  public boolean exists(String username) { /* check if user exists*/ return true; }
} 
class BankOperations {
  private BankApplication ba;
  public BankOperations(BankApplication ba) {
    this.ba = ba;
  }
  public void doUserActions() {
    System.out.println(ba.exists("user"));
    System.out.println(ba.getUserBalance("1111"));
  }
  public static void main(String[] args) {
    AccountClass ac = new AccountClass();
    ac.depositFunds(new UserClass(), "user", 1.0);
    BankOperations bo = new BankOperations(new UserClass());
    bo.doUserActions();
  }
} 
 | 
Risk Assessment
Acyclic dependencies between packages can lead to fragile builds. A security vulnerability in any package will easily percolate to several other packages.
...