Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / August 2007

Tip: Looking for answers? Try searching our database.

Variable in Setter

Thread view: 
teser3@hotmail.com - 11 Aug 2007 02:21 GMT
I have this:
BeanChalker.setLastname(lastname);

Is it possible to use variables like this because I am not sure how to
set up the variable or use concatenator some way to make it work:

String myvariableOne = "Lastname";
String myvariableTwo  = "lastname";
BeanChalker.set + myvariableOne + (myvariableTwo);
Joshua Cranmer - 11 Aug 2007 03:32 GMT
> I have this:
> BeanChalker.setLastname(lastname);
[quoted text clipped - 5 lines]
> String myvariableTwo  = "lastname";
> BeanChalker.set + myvariableOne + (myvariableTwo);

If I understand you correctly, what you want is a runtime method
dispatch. The short answer to your question is "no it is not possible."
The medium answer is "well, yes it is, but it is generally not a good
idea to try and use."

The easiest way to do what you want to do is to manually set functions
up yourself:

class Foo {
   private String varA, varB, varC;
   // constructors, etc.

   public void setA(String newA) {varA = newA;}
   public void setB(String newB) {varB = newB;}
   public void setC(String newC) {varC = newC;}

   public void set(String variable, String value) {
       if ("A".equals(variable))
           setA(value);
       else if ("B".equals(variable))
           setB(value);
       else if ("C".equals(variable))
           setC(value);
       else
           throw new IllegalArgumentException("Variable "+variable+
               " not found!");
   }
}

If you really want the long answer, you probably don't. Use the previous
solution if at all feasible or not at all.

Still want it? Here's the reflection method:

class Foo { /* Defined similar to above sample, except w/o set */ }

class Test {
    public void foobar() {
        String variable = "Lastname";
        String value = "Stroustrup"; // Kudos if you get the reference!
        Foo bar = new Foo(); // assume it works

        Class<?> fooClass = Foo.class;
        try {
           Method m = fooClass.getMethod("set"+variable);
           m.invoke(bar,value);
        } catch (Exception e) { // See the APIs for all exceptions
            // Don't do this in real code.
        }
    }
}

I don't recommend that approach.
Signature

Beware of bugs in the above code; I have only proved it correct, not
tried it. -- Donald E. Knuth

Mike Schilling - 11 Aug 2007 07:03 GMT
>> I have this:
>> BeanChalker.setLastname(lastname);
[quoted text clipped - 59 lines]
>
> I don't recommend that approach.

A very nice and thorough answer.  I have one more suggestion.  If what
you're really looking for is a way to choose a setter, and only a setter
(OK, maybe a getter too), at runtime, you're better off having a single set
method that accesses a map:

   private Map values = new HashMap();

   public void set(String key, String value)
   {
       values.set(key, value);
    }

   public String get(String key)
   {
       return values.get(key);
   }

or, if you want to constrain the set of possible keys, add the following

   static Set keys;
   static
   {
       keys = new HashSet()
       keys.add("firstName");
       keys.add("lastName");
       //etc.
   }

   private checkKey(String key)
   {
       if (!keys.contains(key))
           throw new IllegalArgumentException(key);
   }

and begin both get() and set() with calls to checkKey().
teser3@hotmail.com - 11 Aug 2007 14:31 GMT
On Aug 11, 2:03 am, "Mike Schilling" <mscottschill...@hotmail.com>
wrote:
> > tes...@hotmail.com wrote:
> >> I have this:
[quoted text clipped - 77 lines]
>         return values.get(key);
>     }

Thanks,

String myvariableTwo  = "lastname";
Would I use this for my get info?
get(myvariableTwo);

> or, if you want to constrain the set of possible keys, add the following
>
[quoted text clipped - 16 lines]
>
> - Show quoted text -

String myvariableTwo  = "lastname";
And this would be?
checkKey(myvariableTwo);
Mike Schilling - 11 Aug 2007 15:15 GMT
> On Aug 11, 2:03 am, "Mike Schilling" <mscottschill...@hotmail.com>
> wrote:
[quoted text clipped - 86 lines]
> Would I use this for my get info?
> get(myvariableTwo);

Exactly.

>> or, if you want to constrain the set of possible keys, add the
>> following
[quoted text clipped - 22 lines]
> And this would be?
> checkKey(myvariableTwo);

The client wouldn't call checkKey.  The get and set methods would be changed
to:

    public void set(String key, String value)
    {
       checkKey(key);
       values.set(key, value);
     }

    public String get(String key)
    {
           checkKey(key);
            return values.get(key);
    }
teser3@hotmail.com - 12 Aug 2007 00:25 GMT
Thanks!

Is this correct?

Inside the BeanChalker class:
....
private String lastname;
private String firstname;
BeanChalker() {}

public String getLastname() {
return lastname;
}

public void setLastname(String lastname) {
this.lastname = lastname;
}

public String getFirstname() {
return firstname;
}

public void setFirstname(String firstname) {
this.firstname = firstname;
}

//or do I put this in the BeanChalker class instead?

public void set(String key, String value)
    {
       checkKey(key);
       values.set(key, value);
     }

    public String get(String key)
    {
           checkKey(key);
            return values.get(key);
    }
.......

//then call like this in the Servlet?

 static Set keys;
   static
   {
       keys = new HashSet()
       keys.add("firstName");
       keys.add("lastName");
       //etc.
   }

   private checkKey(String key)
   {
       if (!keys.contains(key))
           throw new IllegalArgumentException(key);
   }

String myvariableFirst = "firstname";
String myvariableLast  = "lastname";
Would I use this for my get info?
BeanChalker.get(myvariableFirst);
BeanChalker.get(myvariableLast);


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.