Welcome!

Eclipse Authors: Pat Romanski, Elizabeth White, Liz McMillan, David H Deans, JP Morgenthal

Related Topics: Java IoT, Eclipse

Java IoT: Article

Eclipse Special: Bill Dudney Looks at the Change Method Signature Refactoring

Eclipse Special: Bill Dudney Looks at the Change Method Signature Refactoring

This column contains an excerpt from one of the refactoring chapters in my book Eclipse 3 Live. The book will eventually contain similar sections for all the refactorings available in Eclipse.

Change Method Signature

This refactoring allows you to change the signature of an existing method by changing any of the aspects of the method that make its signature. You can change the access rights (public, private, etc.), you can change the name as well as add or remove parameters, and you can add or remove exceptions that are thrown from the method.

The most typical use of this refactoring is to add or remove parameters from a method. Over time, you might discover that a method would be better designed or easier to understand or implement if it took an additional parameter. Another reason to use this refactoring is that during the process of refining/refactoring your code, you might discover that you no longer need one of the parameters that is being passed in. In addition to adding and removing parameters, this refactoring is also helpful in changing the access privileges on methods. I most commonly change access rights to be more restrictive (i.e., public to protected or private). Sometimes for retrofitting unit tests onto existing code, however, I change privileges to be less restrictive. This refactoring will change all the subclass implementations of the method to match the new access privilege.

Change Method Signature - AntiPattern Example

During some recent development on the MyFaces project, I implemented a method and then realized that I needed an additional parameter in order to make the method work properly. Specifically, I added some code to handle some of the factory lookup functionality. At first, I was only interested in getting the algorithm correct and not on how to make sure the actual configuration was set properly. The initial method is shown in Listing 1 below.

Listing 7.2 Initial performMetaInfFactoryConfig


protected FactoryConfig performMetaInfFactoryConfig(
      ExternalContext context) throws FacesException {
    Set factoryNames = FactoryFinder.getFactoryNames();
    // keyed on resource names, factory name is the value
    Map resourceNames = expandFactoryNames(factoryNames);
    //Search for factory files in the jar file
    Set services = context
        .getResourcePaths(META_INF_SERVICES_LOCATION);
    // retainAll performs the intersection of the factory
    // names that we are looking for the ones found, only the
    // services found that match the expected factory names 
    // will be retained
    services.retainAll(resourceNames.keySet());
    Iterator itr = services.iterator();
    FactoryConfig config = new FactoryConfig();
    while (itr.hasNext()) {
      String resourceName = (String) itr.next();
      InputStream is = context
          .getResourceAsStream(resourceName);
      InputStreamReader isr = new InputStreamReader(is);
      BufferedReader br = new BufferedReader(isr);
      String className = null;
      try {
        className = br.readLine();
      } catch (IOException e) {
        throw new FacesException(
            "Unable to read class name from file "
                + resourceName, e);
      }
      try {
        Class.forName(className);
      } catch (ClassNotFoundException e) {
        throw new FacesException("Unable to find class "
            + className, e);
      }
      config.setFactory((String) resourceNames
          .get(resourceName), className);
    }
    return config;
  }

So after completing this code and testing it, I realized that the configuration was not actually being updated. Following the standard of the other code in this class that did similar things, I decided to pass in the configuration object that maintained the overall configuration. And instead of just making the change and then tracking down the compilation problems, I applied the refactoring.

Change Method Signature - Apply the Refactoring

The first step in using any of the refactorings is to invoke it via the context menu in the Java editor. For this refactoring to work, you must select a method signature or any line in the method body. Keep in mind that for a particular refactoring to be available, you must have an element selected that the desired refactoring can effect. Figure 1 shows the refactoring menu item selected over the selected method name.

I almost always end up double-clicking on the method name just to make sure that I'm invoking the refactoring on the correct element.

After invoking the refactoring, you will see a dialog box that looks like Figure 2.

There are two things that need to be changed to have this method match the rest of the methods in the class. First, the return type must be changed to void and an additional parameter of type FacesConfig must be added. Since this method returns a value and the return type is being changed to void, Eclipse will complain that the result of the refactoring will not compile. You can safely hit Continue and then remove the return statement after the refactoring is complete. Figure 3 shows the updated values.

Notice that the default value for the new parameter must be specified and that it is defaulted to null. For simple values like String or int, you can specify the value in this dialog box. For more complex values, you will have to do some work after refactoring. Now that we have the values changed and specified, click the OK button. After doing some internal checking, Eclipse will report that a void method should not return a value. As stated earlier, it is OK to ignore this warning and click the Continue button. After the refactoring completes, the return statement can be deleted. There is one more small change to make; we need to apply the factory configuration to the overall configuration object facesConfig. The refactored code is shown in Listing 3

Listing 3 Refactored performMetaInfFactoryConfig


protected void performMetaInfFactoryConfig(
      ExternalContext context, FacesConfig facesConfig)
      throws FacesException {
    Set factoryNames = FactoryFinder.getFactoryNames();
    // keyed on resource names, factory name is the value
    Map resourceNames = expandFactoryNames(factoryNames);
    //Search for factory files in the jar file
    Set services = context
        .getResourcePaths(META_INF_SERVICES_LOCATION);
    // retainAll performs the intersection of the factory
    // names that we are looking for the ones found, only the
    // services found that match the expected factory names
    // will be retained
    services.retainAll(resourceNames.keySet());
    Iterator itr = services.iterator();
    FactoryConfig config = new FactoryConfig();
    while (itr.hasNext()) {
      String resourceName = (String) itr.next();
      InputStream is = context
          .getResourceAsStream(resourceName);
      InputStreamReader isr = new InputStreamReader(is);
      BufferedReader br = new BufferedReader(isr);
      String className = null;
      try {
        className = br.readLine();
      } catch (IOException e) {
        throw new FacesException(
            "Unable to read class name from file "
                + resourceName, e);
      }
      try {
        Class.forName(className);
      } catch (ClassNotFoundException e) {
        throw new FacesException("Unable to find class "
            + className, e);
      }
      config.setFactory((String) resourceNames
          .get(resourceName), className);
    }
    facesConfig.setFactoryConfig(config);
  }

Now that the code is refactored you can easily search for all the uses of the method and change the default null value to be a more appropriate value. You can use the context menu's References->Workspace to have Eclipse search the whole workspace for calls to the method. In this example the method is protected so it makes things a bit easier to do manually but it is a great excuse to get some experience using Eclipse's great search features.

More Stories By Bill Dudney

Bill Dudney is Editor-in-Chief of Eclipse Developer's Journal and serves too as JDJ's Eclipse editor. He is a Practice Leader with Virtuas Solutions and has been doing Java development since late 1996 after he downloaded his first copy of the JDK. Prior to Virtuas, Bill worked for InLine Software on the UML bridge that tied UML Models in Rational Rose and later XMI to the InLine suite of tools. Prior to getting hooked on Java he built software on NeXTStep (precursor to Apple's OSX). He has roughly 15 years of distributed software development experience starting at NASA building software to manage the mass properties of the Space Shuttle.

Comments (1) View Comments

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


Most Recent Comments
digitwiz101 06/22/04 10:37:59 AM EDT

A useful trick with this refactoring is to change the default to something like DOES_NOT_COMPILE or ZZZZZZ. This way, when you recompile after the refactoring, the compiler will immediately alert you with problems for each place where you need to examine the calls to the refactored method.

IoT & Smart Cities Stories
All in Mobile is a place where we continually maximize their impact by fostering understanding, empathy, insights, creativity and joy. They believe that a truly useful and desirable mobile app doesn't need the brightest idea or the most advanced technology. A great product begins with understanding people. It's easy to think that customers will love your app, but can you justify it? They make sure your final app is something that users truly want and need. The only way to do this is by ...
Digital Transformation and Disruption, Amazon Style - What You Can Learn. Chris Kocher is a co-founder of Grey Heron, a management and strategic marketing consulting firm. He has 25+ years in both strategic and hands-on operating experience helping executives and investors build revenues and shareholder value. He has consulted with over 130 companies on innovating with new business models, product strategies and monetization. Chris has held management positions at HP and Symantec in addition to ...
Dynatrace is an application performance management software company with products for the information technology departments and digital business owners of medium and large businesses. Building the Future of Monitoring with Artificial Intelligence. Today we can collect lots and lots of performance data. We build beautiful dashboards and even have fancy query languages to access and transform the data. Still performance data is a secret language only a couple of people understand. The more busine...
DXWorldEXPO LLC announced today that Big Data Federation to Exhibit at the 22nd International CloudEXPO, colocated with DevOpsSUMMIT and DXWorldEXPO, November 12-13, 2018 in New York City. Big Data Federation, Inc. develops and applies artificial intelligence to predict financial and economic events that matter. The company uncovers patterns and precise drivers of performance and outcomes with the aid of machine-learning algorithms, big data, and fundamental analysis. Their products are deployed...
The challenges of aggregating data from consumer-oriented devices, such as wearable technologies and smart thermostats, are fairly well-understood. However, there are a new set of challenges for IoT devices that generate megabytes or gigabytes of data per second. Certainly, the infrastructure will have to change, as those volumes of data will likely overwhelm the available bandwidth for aggregating the data into a central repository. Ochandarena discusses a whole new way to think about your next...
CloudEXPO | DevOpsSUMMIT | DXWorldEXPO are the world's most influential, independent events where Cloud Computing was coined and where technology buyers and vendors meet to experience and discuss the big picture of Digital Transformation and all of the strategies, tactics, and tools they need to realize their goals. Sponsors of DXWorldEXPO | CloudEXPO benefit from unmatched branding, profile building and lead generation opportunities.
Cell networks have the advantage of long-range communications, reaching an estimated 90% of the world. But cell networks such as 2G, 3G and LTE consume lots of power and were designed for connecting people. They are not optimized for low- or battery-powered devices or for IoT applications with infrequently transmitted data. Cell IoT modules that support narrow-band IoT and 4G cell networks will enable cell connectivity, device management, and app enablement for low-power wide-area network IoT. B...
The hierarchical architecture that distributes "compute" within the network specially at the edge can enable new services by harnessing emerging technologies. But Edge-Compute comes at increased cost that needs to be managed and potentially augmented by creative architecture solutions as there will always a catching-up with the capacity demands. Processing power in smartphones has enhanced YoY and there is increasingly spare compute capacity that can be potentially pooled. Uber has successfully ...
SYS-CON Events announced today that CrowdReviews.com has been named “Media Sponsor” of SYS-CON's 22nd International Cloud Expo, which will take place on June 5–7, 2018, at the Javits Center in New York City, NY. CrowdReviews.com is a transparent online platform for determining which products and services are the best based on the opinion of the crowd. The crowd consists of Internet users that have experienced products and services first-hand and have an interest in letting other potential buye...
When talking IoT we often focus on the devices, the sensors, the hardware itself. The new smart appliances, the new smart or self-driving cars (which are amalgamations of many ‘things'). When we are looking at the world of IoT, we should take a step back, look at the big picture. What value are these devices providing. IoT is not about the devices, its about the data consumed and generated. The devices are tools, mechanisms, conduits. This paper discusses the considerations when dealing with the...