Setters method in the constructor

Hi everyone;
I am having some trouble with one of my constructor. I am trying to write my constructor as strong as possible to avoid some wrong input by the user during the running time.
Therefore I decided to write setter methods and then use them in my constructor, but when I tried to test my class with JUnit, the test failed and I don't know why !
This is my code :
//CONSTRUCTOR:
      * Creates a new item with a given quantity and price.
      * The constructor use three helper methods.
      * @param itemName
      *                          enter a String for the name of the item.
      * @param itemQuantity
      *                               enter an integer for the quantity of the item.
      * @param itemPrice
      *                               enter a double for the price of the item.
     public Item(String itemName, int itemQuantity, double itemPrice) {
          setItemName(itemName);
          setItemQuantity(itemQuantity);
          setItemPrice(itemPrice);
//SETTER METHODS:
      * Set the quantity of item available in stock.
      * @param itemQuantity
      *                               enter an integer for the quantity of item.
     public void setItemQuantity(int itemQuantity) {
          if (itemQuantity > 0) {
               this.itemQuantity = itemQuantity;
          } else {
               throw new IllegalArgumentException("The amount must"
                         + " be greater than zero.");
      * Set the price of the item.
      * @param itemPrice
      *                          enter a double for the price of the item.
     public void setItemPrice(double itemPrice) {
          if (itemPrice > 0) {
               this.itemPrice = itemPrice;
          } else {
               throw new IllegalArgumentException("The price must be "
                         + "greater than zero");
//JUNIT TEST:
      * Create a new object item.
     private Item item;
      * Set up the test by initialising the new item.
      * @throws Exception (expected = IllegalArgumentExeption.class)
     @Before
     public void setUp() throws Exception {
          item = new Item("Bible", 10, 20.0);
     @Test
     public void constructor() {
          item.getItemName();
          assertEquals("Bible", item.getItemName());
          assertEquals(10, item.getItemPrice());
     }I tested my two setter methods and they work properly in normal and boudary cases.
In my Junit test, when I try to get the item price i have the error : expected IllegalArgumentException.
Does someone have an idea ?
Thank you,
Henri

by the way if your constructor is going to call another method (like the setters) then either the class or the called methods should be final. Otherwise subclasses could change the behavior of the constructor, which is a bad place for behavior to go out of hand.
And generally you're better off designing inheritance into the the design, such that overrideable methods are clearly defined as such and everything else is private or final.
Just my experience, YMMV, etc.

Similar Messages

  • Calling static synchronized method in the constructor

    Is it ok to do so ?
    (calling a static synchronized method from the constructor of the same class)
    Please advise vis-a-vis pros and cons.
    regards,
    s.giri

    I would take a different take here. Sure you can do it but there are some ramifications from a best practices perspective. f you think of a class as a proper object, then making a method static or not is simple. the static variables and methods belong to the class while the non-static variables and methods belong to the instance.
    a method should be bound to the class (made static) if the method operates on the class's static variables (modifies the class's state). an instance object should not directly modify the state of the class.
    a method should be bound to the instance (made non-static) if it operates on the instance's (non-static) variables.
    you should not modify the state of the class object (the static variables) within the instance (non-static) method - rather, relegate that to the class's methods.
    although it is permitted, i do not access the static methods through an instance object. i only access static methods through the class object for clarity.
    and since the instance variables are not part of the class object itself, the language cannot and does not allow access to non-static variables and methods through the class object's methods.

  • Use of an overriden method in the constructor

    Hi.
    I have a base class A whith the methode f() and
    a class B which inherits from A and overrides de
    method f().
    I use f() in the constructor of A.
    My question is: in the A constructor, how to avoid the usage of the overriden method. I need
    to call A.f() not B.f().
    Following is a piece of code desmonstrating the problem:
    class A {
    String s;
    public A(String s) {
    System.out.println(">>>> Begin constructor A ... ");
    f(s); // How to call call A:f() instead of the overriden B.f()
    System.out.println(">>>> End constructor A .");
    void f(String s) {
    System.out.println("Entering A:f() ... ");
    this.s = s;
    public class B extends A {
    public B(String s) { super(s); }
    void f(String s) {
    System.out.println("Entering B:f() ... ");
    super.f(s);
    public static void main(String[] args) {
    B b = new B("Hello world !\n");
    b.f("Bonjour le monde !\n");
    The result I want is :
    Begin constructor A ...Entering A:f() ...
    End constructor A .Entering B:f() ...
    Entering A:f() ...
    but I can only have:
    Begin constructor A ...Entering B:f() ...
    Entering A:f() ...
    End constructor A .Entering B:f() ...
    Entering A:f() ...
    Thanks in advance, Christophe.

    You cannot do that. A good work around is to implement a private version of the method, then call the private version in the public method.
    Here is how I would implement this with your classes (I changed f() to foo())
    class A {
        String s;
        public A(String s) {
            System.out.println(">>>> Begin constructor A ... ");
            fooImpl(s); // Call the private implementation method
            System.out.println(">>>> End constructor A .");
        void foo(String s) {
            fooImpl(s);
        private void fooImpl(String s) {
            System.out.println("Entering A:f() ... ");
            this.s = s;
    public class B extends A {
        public B(String s) { super(s); }
        void foo(String s) {
            System.out.println("Entering B:f() ... ");
            super.foo(s);
        public static void main(String[] args) {
            B b = new B("Hello world !\n");
            b.foo("Bonjour le monde !\n");
    }

  • Error while calling a super class public method in the subclass constructor

    Hi ,
    I have code like this:
    CLASS gacl_applog DEFINITION ABSTRACT.
      PUBLIC SECTION.
        METHODS:
                create_new_a
                   IMPORTING  pf_obj       TYPE balobj_d
                              pf_subobj    TYPE balsubobj
                              pf_extnumber TYPE string
                   EXPORTING  pfx_log_hndl TYPE balloghndl
                   EXCEPTIONS error
    ENDCLASS.
    CLASS gacl_applog IMPLEMENTATION.
      METHOD create_new_a.
        DATA: ls_log TYPE bal_s_log.
      Header aufsetzen
        MOVE pf_extnumber TO ls_log-extnumber.
        ls_log-object     = pf_obj.
        ls_log-subobject  = pf_subobj.
        ls_log-aluser     = sy-uname.
        ls_log-alprog     = sy-repid.
        ls_log-aldate     = sy-datum.
        ls_log-altime     = sy-uzeit.
        ls_log-aldate_del = ls_log-aldate + 1.
        CALL FUNCTION 'BAL_LOG_CREATE'
             EXPORTING
                  i_s_log      = ls_log
             IMPORTING
                  e_log_handle = pfx_log_hndl
             EXCEPTIONS
                  OTHERS       = 1.
        IF ( sy-subrc NE 0 ).
          MESSAGE ID      sy-msgid TYPE sy-msgty NUMBER sy-msgno
                  WITH    sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
                  RAISING error.
        ENDIF.
      ENDMETHOD.
    CLASS gcl_applog_temp DEFINITION INHERITING FROM gacl_applog.
      PUBLIC SECTION.
        DATA: log_hndl   TYPE balloghndl READ-ONLY
            , t_log_hndl TYPE bal_t_logh READ-ONLY
        METHODS: constructor
                   IMPORTING  pf_obj       TYPE balobj_d
                              pf_subobj    TYPE balsubobj
                              pf_extnumber TYPE string
                   EXCEPTIONS error
               , msg_add      REDEFINITION
               , display      REDEFINITION
    ENDCLASS.
    CLASS gcl_applog_temp IMPLEMENTATION.
      METHOD constructor.
        CALL METHOD create_new_a
               EXPORTING  pf_obj       = pf_obj
                          pf_subobj    = pf_subobj
                          pf_extnumber = pf_extnumber
               IMPORTING  pfx_log_hndl = log_hndl.
        IF ( sy-subrc NE 0 ).
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
                  RAISING error.
        ENDIF.
      ENDMETHOD.
    A public method of Super class has been called from the constructor of the sub class. we are getting the syntax error :
    ' In the constructor method, you can only access instance attributes, instance methods, or "ME" after calling the constructor of the superclass…'
    Can you please suggest how to change the code with out affecting the functioanlity.
    Thank you ,
    Lakshmi.

    Hi,
    Call that method by instance of Subclass.   OR
    SUPER-->method.
    Read very useful document
    Constructors
    Constructors are special methods that cannot be called using CALL METHOD. Instead, they are called automatically by the system to set the starting state of a new object or class. There are two types of constructors - instance constructors and static constructors. Constructors are methods with a predefined name. To use them, you must declare them explicitly in the class.
    The instance constructor of a class is the predefined instance method CONSTRUCTOR. You declare it in the public section as follows:
    METHODS CONSTRUCTOR
            IMPORTING.. [VALUE(]<ii>[)] TYPE type [OPTIONAL]..
            EXCEPTIONS.. <ei>.
    and implement it in the implementation section like any other method. The system calls the instance constructor once for each instance of the class, directly after the object has been created in the CREATE OBJECT statement. You can pass the input parameters of the instance constructor and handle its exceptions using the EXPORTING and EXCEPTIONS additions in the CREATE OBJECT statement.
    The static constructor of a class is the predefined static method CLASS_CONSTRUCTOR. You declare it in the public section as follows:
    CLASS-METHODS CLASS_CONSTRUCTOR.
    and implement it in the implementation section like any other method. The static constructor has no parameters. The system calls the static constructor once for each class, before the class is accessed for the first time. The static constructor cannot therefore access the components of its own class.
    Pls. reward if useful....

  • Initialize in the constructor is better or set the value thro' set method?

    Hi,
    For the normal helper classes for servelt or jsp or EJB,
    Which of the following one is the better ...?
    1.
    i.initialize all the fields in the constructor, then
    ii.use the set methods
    or
    2.
    i.do not use the contructor and
    ii.use the set methods to set the values
    Anybody can give the solution for this one...
    With regards
    vkm

    Your option 1 puzzles me, why would you need tyo use the setter methods if you already initialized in the constructor?

  • How to get a method to call the correct passed object in the constructor

    I have 2 constructors for a certain object:
    public class ABC{
    //variables
    private DEF def;
    private GHI ghi;
    public ABC(DEF def){
    this.def = def;
    someMethod();
    public ABC(GHI ghi){
    this.ghi = ghi;
    someMethod();
    }Now, this someMethod() references / calls a method from the 2 classes passed in the constructor say def.getSome() and ghi.getSome().
    Depending on which constructor is used, it should call the respective xxx.getSome(). Do I need to write 2 someMethod()s or is there a way that one method will call the proper xxx.getSome() ?
    Thanks.....

    Hi
    Following the example may be help to you call correct method,
    // Interface QuizMaster
    public interface QuizMaster {
         public String popQuestion();
    // Class StrutsQuizMaster
    public class StrutsQuizMaster implements QuizMaster{
         public String popQuestion() {
              return "Are you new to Struts?";
    // Class SpringQuizMaster
    public class SpringQuizMaster implements QuizMaster{
         public String popQuestion() {
              return "Are you new to Spring?";
    // Class QuizMasterService
    public class QuizMasterService {
         QuizMaster quizMaster;
         public QuizMasterService(SpringQuizMaster quizMaster){
              this.quizMaster = quizMaster;
         public QuizMasterService(StrutsQuizMaster quizMaster){
              this.quizMaster = quizMaster;
         public void askQuestion()
              System.out.println(quizMaster.popQuestion());
    // QuizProgram
    public class QuizProgram {
         public static void main(String[] args) {
              // Option : 1
    // StrutsQuizMaster quizMaster = new StrutsQuizMaster();
    // Option : 2
    SpringQuizMaster quizMaster = new SpringQuizMaster();
              QuizMasterService quizMasterService = new QuizMasterService(quizMaster);                    
              quizMasterService.askQuestion();
    here you can create object of StrutsQuizMaster or SpringQuizMaster and pass into the QuizMasterService object constructor, base on the object correct method will be called.

  • Getting Bad Type Error when calling a method in the proxy class

    Hi,
    I have generated the proxy classes from wsdl.
    When I am calling the methods in the proxy class from one of external class, I am getting following error.
    Can anyone please help me in resolving this issue.
    javax.xml.ws.soap.SOAPFaultException: org.xml.sax.SAXException: Bad types (interface javax.xml.soap.SOAPElement -> class com.intraware.snetmgr.webservice.data.SubscribeNetObjectReference) Message being parsed:
         at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:197)
         at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:122)
         at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:125)
         at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:95)
         at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:136)
         at $Proxy176.find(Unknown Source)
         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
         at java.lang.reflect.Method.invoke(Method.java:597)
         at weblogic.wsee.jaxws.spi.ClientInstanceInvocationHandler.invoke(ClientInstanceInvocationHandler.java:84)
         at $Proxy173.find(Unknown Source)
         at com.xxx.fs.FNServices.findAccountWs(FNServices.java:132)
         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
         at java.lang.reflect.Method.invoke(Method.java:597)
         at weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:92)
         at weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:74)
         at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:151)
         at com.sun.xml.ws.server.sei.EndpointMethodHandlerImpl.invoke(EndpointMethodHandlerImpl.java:268)
         at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:100)
         at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:866)
         at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:815)
         at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:778)
         at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:680)
         at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:403)
         at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:532)
         at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:253)
         at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:140)
         at weblogic.wsee.jaxws.WLSServletAdapter.handle(WLSServletAdapter.java:171)
         at weblogic.wsee.jaxws.HttpServletAdapter$AuthorizedInvoke.run(HttpServletAdapter.java:708)
         at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
         at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:146)
         at weblogic.wsee.util.ServerSecurityHelper.authenticatedInvoke(ServerSecurityHelper.java:103)
         at weblogic.wsee.jaxws.HttpServletAdapter$3.run(HttpServletAdapter.java:311)
         at weblogic.wsee.jaxws.HttpServletAdapter.post(HttpServletAdapter.java:336)
         at weblogic.wsee.jaxws.JAXWSServlet.doRequest(JAXWSServlet.java:95)
         at weblogic.servlet.http.AbstractAsyncServlet.service(AbstractAsyncServlet.java:99)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
         at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
         at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
         at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
         at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
         at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
         at oracle.security.jps.ee.http.JpsAbsFilter$1.run(JpsAbsFilter.java:111)
         at java.security.AccessController.doPrivileged(Native Method)
         at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:313)
         at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:413)
         at oracle.security.jps.ee.http.JpsAbsFilter.runJaasMode(JpsAbsFilter.java:94)
         at oracle.security.jps.ee.http.JpsAbsFilter.doFilter(JpsAbsFilter.java:161)
         at oracle.security.jps.ee.http.JpsFilter.doFilter(JpsFilter.java:71)
         at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
         at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:136)
         at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
         at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
         at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
         at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
         at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
         at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
         at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
         at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
         at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
         at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
    Thanks
    Anoop

    Hi Vlad,
    The service has not been changed since i have generated the proxy.
    I tried calling the service from soapUI and I am getting the following error now.
    Request:
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:uri="uri:webservice.subscribenet.intraware.com" xmlns:uri1="uri:subscribenet.intraware.com">
    <soapenv:Header>
    <uri:SessionHeader>
    <uri:SessionID>hjkashd9sd90809dskjkds090dsj</uri:SessionID>
    </uri:SessionHeader>
    </soapenv:Header>
    <soapenv:Body>
    <uri:Find>
    <uri:SubscribeNetObjectReference>
    <uri1:ID></uri1:ID>
    <uri1:IntrawareID></uri1:IntrawareID>
    <uri1:SharePartnerID></uri1:SharePartnerID>
    </uri:SubscribeNetObjectReference>
    </uri:Find>
    </soapenv:Body>
    </soapenv:Envelope>
    Response:
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Header/>
    <soapenv:Body>
    <soapenv:Fault>
    <faultcode>soapenv:Server.generalException</faultcode>
    <faultstring>org.xml.sax.SAXException: WSWS3279E: Error: Unable to create JavaBean of type com.intraware.snetmgr.webservice.data.SubscribeNetObjectReference. Missing default constructor? Error was: java.lang.InstantiationException: com.intraware.snetmgr.webservice.data.SubscribeNetObjectReference. Message being parsed:</faultstring>
    </soapenv:Fault>
    </soapenv:Body>
    </soapenv:Envelope>
    Thanks
    Anoop

  • Being specific in the Constructor, only when necessary

    Hello! I am new to Java. I have a few really simple question. I know this much so far:
    - Hiding is when a variable overrides another within a stronger (more inner) scope.
    - Hiding is not good convention since it may confuse readers of code.
    So I have this example. It's only part of an example, so it will only be the essential parts:
    package example;
    import java.awt.*;
    public class Application {
         * The options component for this Application.
        Component optWindow;
        public Application() {
            Window optWindow = new OptionWindow();
            optWindow.pack();
            this.optWindow = optWindow;
        public void showOptions() {
            optWindow.setVisible(true);
        @Override protected void finalize() throws Throwable {
            optWindow.setVisible(false);
            optWindow = null;
            super.finalize();
    class OptionWindow extends Frame {
        public OptionWindow() {
            super("Options:");
    }Anyway, I also know that optWindow in the constructor hides this.optWindow. But I'm not sure 100% why.
    My reasoning behind wanting to do this is that I don't think that the rest of the Application needs to know that optWindow is a Window other than in the constructor, so the Application Object should store it as just an abstract component. A sort of "type encapsulation and subclass separation".
    I believe that the reason why this is hiding is because optWindow refers to the "reference" of the OptionWindow object, not the object itself =) I understand that so far.
    But I believe it shouldn't because the this.optWindow does not refer to anything until after the constructor, so it shouldn't be hidden.
    I have a few solutions I know of:
    1) Drop the idea of storing optWindow as a Component in the Application Objects. Just store it as a window everywhere.
    2) Keep it this way anyway.
    3) Use a different variable name for the optWindow in the constructor.
    There are in the order that I'd rather do them in. I understand that option 1 is the best. Option 2 might potentially be okay. Option 3, I really do not like since it's giving two names or references to the same object and it would be annoying to come up with a new name for it. But I could come up with something simple like "window" if necessary inside of the constructor.
    My questions would be:
    1) Is this a good idea to make the window an abstract component outside of the constructor?
    2) Is this a "good" use of hiding; or does the rule always apply to avoid hiding?
    If Question 1 is true, I'd probably go with Option 1. If Question 1 is false, but Question 2 is true, I'll go with Option 2. If Question 1 is still false, but so is Question 2, I'll go with Option 3.
    Thank you very much in advanced! I really appreciate the help! =) And I look forward to asking more questions.
    Edit: I wrote that OptionWindow throw Frame instead of "extends Frame".
    Edited by: Macleod789 on Mar 30, 2010 2:24 PM

    Macleod789 wrote:
    Hello! I am new to Java. I have a few really simple question. I know this much so far:
    - Hiding is when a variable overrides another within a stronger (more inner) scope.
    - Hiding is not good convention since it may confuse readers of code.It's common and perfectly acceptable in some situations. Constructors and setters come to mind. If your code is well-written, it won't be at all confusing.
    >
    So I have this example. It's only part of an example, so it will only be the essential parts:
    package example;
    import java.awt.*;
    public class Application {
    * The options component for this Application.
    Component optWindow;
    public Application() {
    Window optWindow = new OptionWindow();
    optWindow.pack();
    this.optWindow = optWindow;
    public void showOptions() {
    optWindow.setVisible(true);
    @Override protected void finalize() throws Throwable {
    optWindow.setVisible(false);
    optWindow = null;
    super.finalize();
    class OptionWindow extends Frame {
    public OptionWindow() {
    super("Options:");
    }Anyway, I also know that optWindow in the constructor hides this.optWindow. But I'm not sure 100% why.Because the JLS defines that it does. Local variables always hide members of the same name. That's the rule the designers decided on.
    My reasoning behind wanting to do this is that I don't think that the rest of the Application needs to know that optWindow is a Window other than in the constructor, so the Application Object should store it as just an abstract component. A sort of "type encapsulation and subclass separation".\Huh? Reason behind doing what? Declaring the optWindow member as a Component rather than a Window? Well, yeah, if the rest of the Application class only cares that it's a Component and could do its job the same way if any other Component were used, then you're right--declaring it as a Component is the correct approach. But then it should not be named optWindow. And if the rest of the Application class doesn't need it to be a Window, then the c'tor has no reason to require that either.
    I believe that the reason why this is hiding is because optWindow refers to the "reference" of the OptionWindow object, not the object itself =) I understand that so far.Reference vs. object is an important distinction to understand. However, it has nothing to do with hiding. Hiding is just about identifier names, like variables. The fact that their values are references is irrelevant to the hiding rules.
    But I believe it shouldn't because the this.optWindow does not refer to anything until after the constructor, so it shouldn't be hidden.Show me the part of the JLS that says that hiding has do with whether the variable in question has been assigned or not.
    In some scopes, two distinct identifiers with the same name can exist. There has to be some rule about which one takes precedence when there's no qualification. It's simpler if it's consistent and it's always the local. If it weren't, then a) it would be inconsistent, which would be confusing, and b) we'd need a new keyword or other mechanism to explicitly indicate that we're talking about the local. Or else we simply wouldn't be able to access the local variable in those contexts, which would be pretty stupid, I'm sure you agree.
    I have a few solutions I know of:Solutions to what? What's the problem you're encountering?
    1) Drop the idea of storing optWindow as a Component in the Application Objects. Just store it as a window everywhere.I addressed that above, and it has nothing to do with hiding.
    2) Keep it this way anyway.So, a "solution" to whatever problem you're having is to do nothing and just keep having the "problem"?
    1) Is this a good idea to make the window an abstract component outside of the constructor?If it's Component in the member variable, it should be in the c'tor too. If the c'tor requires a Window, then it must be because the member has to be a Window.
    2) Is this a "good" use of hiding; or does the rule always apply to avoid hiding?It's very common and acceptable to have parameter names match member names where the parameter is being used to set the member.
    Edited by: jverd on Mar 30, 2010 2:49 PM
    Edited by: jverd on Mar 30, 2010 2:50 PM

  • Where can we find the methods of the classes in OLE Interface

    Hi All,
    I am developing the code to download the file into multiple sheets of excel file.
    got many links and sample codes from this forum.
    but my doubt is where can we find the methods in applications.
    Example:
    add, cells, range etc are the methods in the object excel.application.
    I want to find all other methods in this same object.
    Please help me.
    thanks in adv.
    Eswar

    HE,
    see this demo program which is in DWDM
    *& Report  DEMOEXCELINTEGRATION                                        *
    INCLUDE rdemoexcelintegrationtop.
    DATA: control TYPE REF TO i_oi_ole_container_control.
    DATA: container TYPE REF TO cl_gui_custom_container.
    DATA: link_server TYPE REF TO i_oi_link_server.
    DATA: table_coll TYPE REF TO i_oi_table_collection.
    DATA: retcode TYPE t_oi_ret_string,
          document_type TYPE soi_document_type
                                           VALUE soi_doctype_excel_chart,
          document_format TYPE soi_document_type.
    DATA: doc_url TYPE t_url.
    DATA: usa_sales TYPE i VALUE 1000,
          europe_sales TYPE i VALUE 2000,
          japan_sales TYPE i VALUE 1000,
          asia_sales TYPE i VALUE 100,
          america_sales TYPE i VALUE 100,
          africa_sales TYPE i VALUE 100.
    DATA: total_sales TYPE i VALUE 0.
    DATA: BEGIN OF test_line, region(50), sales TYPE i, END OF test_line.
    DATA: test_table LIKE TABLE OF test_line.
    DATA: wa_test_table LIKE test_line.
          CLASS c_excel_document DEFINITION
    CLASS c_excel_document DEFINITION.
      PUBLIC SECTION.
        DATA: proxy TYPE REF TO i_oi_document_proxy.
        DATA: document_type TYPE soi_document_type.
        DATA: data_table TYPE sbdst_content,
              data_size TYPE i,
              doc_url TYPE t_url.
        METHODS: constructor
                  IMPORTING control TYPE REF TO i_oi_ole_container_control
                            document_type TYPE soi_document_type.
        METHODS: on_close_document
                  FOR EVENT on_close_document OF i_oi_document_proxy
                  IMPORTING document_proxy has_changed.
        METHODS: on_custom_event
                  FOR EVENT on_custom_event OF i_oi_document_proxy
                  IMPORTING document_proxy event_name param_count
                            param1 param2 param3.
        METHODS: create_document
                      IMPORTING open_inplace  TYPE c DEFAULT ' '
                      EXPORTING retcode TYPE t_oi_ret_string.
        METHODS: open_document
                      IMPORTING open_inplace  TYPE c DEFAULT ' '
                                open_readonly TYPE c DEFAULT ' '
                      EXPORTING retcode TYPE t_oi_ret_string.
        METHODS: open_document_url
                      IMPORTING open_inplace  TYPE c DEFAULT ' '
                                open_readonly TYPE c DEFAULT ' '
                                doc_url TYPE t_url DEFAULT ' '
                      EXPORTING retcode TYPE t_oi_ret_string.
        METHODS: retrieve_document
                     IMPORTING documents TYPE document_list
                     EXPORTING document_format TYPE soi_document_type
                               doc_url TYPE t_url.
        METHODS: close_document
                      IMPORTING do_save     TYPE c DEFAULT ' '
                      RETURNING value(retcode) TYPE t_oi_ret_string.
      PRIVATE SECTION.
        DATA: control  TYPE REF TO i_oi_ole_container_control.
    ENDCLASS.
    DATA: l_fcode LIKE fcode.
    DATA: document TYPE REF TO c_excel_document.
    DATA: bds_instance TYPE REF TO cl_bds_document_set.
    *&      Module  STATUS_0100  OUTPUT
    MODULE status_0100 OUTPUT.
      SET PF-STATUS 'MAIN0100'.
      SET TITLEBAR '001'.
      retcode = c_oi_errors=>ret_ok.
      IF control IS INITIAL.
        DATA: b_has_activex.
        CALL FUNCTION 'GUI_HAS_ACTIVEX'
             IMPORTING
                  return = b_has_activex.
        IF b_has_activex IS INITIAL. MESSAGE e007. ENDIF.
        CALL METHOD c_oi_ole_control_creator=>get_ole_container_control
                          IMPORTING control = control
                                    retcode = retcode.
        CALL METHOD c_oi_errors=>show_message
                                      EXPORTING type = 'E'.
        CREATE OBJECT container
                  EXPORTING container_name = 'CONTAINER'.
        CALL METHOD control->init_control
                            EXPORTING r3_application_name =
                                                  'Demo' "#EC NOTEXT
                                      inplace_enabled = 'X'
                                      inplace_scroll_documents = 'X'
                                      parent = container
                                      register_on_close_event = 'X'
                                      register_on_custom_event = 'X'
                            IMPORTING retcode = retcode.
        CALL METHOD c_oi_errors=>show_message
                                      EXPORTING type = 'E'.
        CALL METHOD control->get_link_server
                           IMPORTING link_server = link_server
                                     retcode = retcode.
        CALL METHOD c_oi_errors=>show_message
                                      EXPORTING type = 'E'.
        CALL METHOD link_server->start_link_server
                          IMPORTING retcode = retcode.
        CALL METHOD c_oi_errors=>show_message
                                      EXPORTING type = 'E'.
        CALL METHOD control->get_table_collection
                        IMPORTING table_collection = table_coll
                                  retcode = retcode.
        PERFORM refresh_sales.
        CREATE OBJECT document
                  EXPORTING control = control
                            document_type = document_type.
        CALL METHOD table_coll->add_table
                        EXPORTING table_name = 'SALES_IN'
                                  table_type = table_coll->table_type_input
                        IMPORTING retcode = retcode
                        CHANGING  data_table = test_table.
      ENDIF.
      IF bds_instance IS INITIAL.
        CREATE OBJECT bds_instance.
      ENDIF.
    ENDMODULE.                             " STATUS_0100  OUTPUT
    *&      Module  USER_COMMAND_0100  INPUT
    MODULE user_command_0100 INPUT.
      l_fcode = fcode.
      CLEAR fcode.
      CALL METHOD cl_gui_cfw=>dispatch.
      CASE l_fcode.
        WHEN 'EXIT'.                       "Zurück
          IF NOT document IS INITIAL.
            CALL METHOD document->close_document.
            FREE document.
          ENDIF.
          IF NOT link_server IS INITIAL.
            CALL METHOD link_server->stop_link_server
                                           IMPORTING retcode = retcode.
            FREE link_server.
          ENDIF.
          IF NOT table_coll IS INITIAL.
            FREE table_coll.
          ENDIF.
          IF NOT control IS INITIAL.
            CALL METHOD control->destroy_control
                                                IMPORTING retcode = retcode.
            FREE control.
          ENDIF.
          IF NOT bds_instance IS INITIAL.
            FREE bds_instance.
          ENDIF.
          LEAVE TO SCREEN 0.
        WHEN 'CREATE'.
          IF NOT control IS INITIAL.
            document->data_size = 0.
            CLEAR document->data_table.
            CALL METHOD document->create_document.
            CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
          ENDIF.
        WHEN 'SELECT'.
          IF NOT control IS INITIAL.
            DATA: documents TYPE document_list.
            DATA: descr TYPE document_descr.
            CLEAR documents.
            descr-document_name = 'Car Sales Chart'(do1).
            descr-document_id = 'DEMOEXCELCHART1'.
            APPEND descr TO documents.
            descr-document_name = 'Car Sales Chart 2'(do3).
            descr-document_id = 'DEMOEXCELCHART2'.
            APPEND descr TO documents.
            descr-document_name = 'Car Sales Sheet'(do2).
            descr-document_id = 'DEMOEXCELSHEET1'.
            APPEND descr TO documents.
            CLEAR doc_url.
            CALL METHOD document->retrieve_document
                        EXPORTING documents = documents
                        IMPORTING document_format = document_format
                                  doc_url = doc_url.
            IF NOT doc_url IS INITIAL.
              CALL METHOD document->close_document.
              CALL METHOD document->open_document_url
                                EXPORTING open_inplace = 'X'
                                          doc_url = doc_url
                                IMPORTING retcode = retcode.
              CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
            ELSE.
              MESSAGE e010.
            ENDIF.
          ENDIF.
        WHEN 'OPEN'.
          IF document->data_size NE 0.
            IF NOT control IS INITIAL.
              CALL METHOD document->open_document
                                IMPORTING retcode = retcode.
              CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
            ENDIF.
          ELSE.
            MESSAGE e005.
          ENDIF.
        WHEN 'INPLACE'.
          IF document->data_size NE 0.
            IF NOT control IS INITIAL.
              CALL METHOD document->open_document
                                EXPORTING open_inplace = 'X'
                                          open_readonly = 'X'
                                IMPORTING retcode = retcode.
              CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
            ENDIF.
          ELSE.
            MESSAGE e005.
          ENDIF.
        WHEN 'SAVEAS'.
          IF NOT document IS INITIAL AND NOT document->proxy IS INITIAL.
            CALL METHOD document->proxy->save_as
                              EXPORTING prompt_user = 'X'
                              IMPORTING retcode = retcode.
            CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
          ELSE.
            MESSAGE e000.
          ENDIF.
        WHEN 'CLOSE'.
          IF NOT document IS INITIAL.
            CALL METHOD document->close_document
                          EXPORTING do_save = 'X'.
            CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
          ELSE.
            MESSAGE e000.
          ENDIF.
        WHEN 'COPYLINK'.
          IF NOT link_server IS INITIAL.
            PERFORM refresh_sales.
            CALL METHOD link_server->execute_copy_link_dialog
                     IMPORTING retcode = retcode.
            CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
          ELSE.
            MESSAGE e004.
          ENDIF.
        WHEN 'REFRESH'.
          IF NOT link_server IS INITIAL.
            PERFORM refresh_sales.
          ELSE.
            MESSAGE e004.
          ENDIF.
          IF NOT document IS INITIAL AND NOT document->proxy IS INITIAL.
            CALL METHOD document->proxy->execute_macro
                          EXPORTING macro_string = 'R3StartupMacro'
                                    param_count = 1
                                    param1 = 10
                          IMPORTING retcode = retcode.
                         CHANGING  retvalue = usa_sales.
            CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
          ELSE.
            MESSAGE e000.
          ENDIF.
        WHEN 'PRINT'.
          IF NOT document IS INITIAL AND NOT document->proxy IS INITIAL.
            CALL METHOD document->proxy->print_document
                           EXPORTING prompt_user = 'X'
                           IMPORTING retcode = retcode.
            CALL METHOD c_oi_errors=>show_message EXPORTING type = 'E'.
          ELSE.
            MESSAGE e000.
          ENDIF.
      ENDCASE.
    ENDMODULE.                             " USER_COMMAND_0100  INPUT
    CLASS c_excel_document IMPLEMENTATION.
    CLASS c_excel_document IMPLEMENTATION.
      METHOD: constructor.
                 IMPORTING control TYPE REF TO i_oi_ole_container_control
                           document_type TYPE soi_document_type
        me->control = control.
        me->document_type = document_type.
      ENDMETHOD.
      METHOD create_document.
                    IMPORTING open_inplace  TYPE c DEFAULT ' '
                    RETURNING value(retcode) TYPE t_oi_ret_string.
        IF NOT proxy IS INITIAL.
          CALL METHOD me->close_document.
        ENDIF.
        CALL METHOD control->get_document_proxy
                 EXPORTING document_type = document_type
                 IMPORTING document_proxy = proxy
                           retcode = retcode.
        IF retcode NE c_oi_errors=>ret_ok.
          EXIT.
        ENDIF.
        CALL METHOD proxy->create_document
                            EXPORTING create_view_data = 'X'
                                      open_inplace = open_inplace
                            IMPORTING retcode = retcode.
        IF retcode NE c_oi_errors=>ret_ok.
          EXIT.
        ENDIF.
        SET HANDLER me->on_close_document FOR proxy.
        SET HANDLER me->on_custom_event FOR proxy.
      ENDMETHOD.
      METHOD open_document.
                    IMPORTING open_inplace  TYPE c DEFAULT ' '
                              open_readonly TYPE c DEFAULT ' '
                    RETURNING value(retcode) TYPE t_oi_ret_string.
        IF NOT proxy IS INITIAL.
          CALL METHOD me->close_document.
        ENDIF.
        CALL METHOD control->get_document_proxy
                 EXPORTING document_type = document_type
                 IMPORTING document_proxy = proxy
                           retcode = retcode.
        IF retcode NE c_oi_errors=>ret_ok.
          EXIT.
        ENDIF.
        CALL METHOD proxy->open_document_from_table
                               EXPORTING document_table = data_table
                                         document_size  = data_size
                                         open_inplace = open_inplace
                                         open_readonly = open_readonly
                               IMPORTING retcode = retcode.
        IF retcode NE c_oi_errors=>ret_ok.
          EXIT.
        ENDIF.
        SET HANDLER me->on_close_document FOR proxy.
        SET HANDLER me->on_custom_event FOR proxy.
        CALL METHOD proxy->update_document_links
                               EXPORTING update_manual_links = 'X'
                               IMPORTING retcode = retcode.
      ENDMETHOD.
      METHOD close_document.
                    IMPORTING do_save TYPE c DEFAULT ' '
                    RETURNING value(retcode) TYPE t_oi_ret_string.
        DATA: is_closed TYPE i, has_changed TYPE i.
        DATA: doc_url(256).
        IF NOT proxy IS INITIAL.
          CALL METHOD proxy->is_destroyed IMPORTING ret_value = is_closed.
          IF is_closed IS INITIAL.
            CALL METHOD proxy->close_document
                         EXPORTING do_save = do_save
                         IMPORTING has_changed = has_changed
                                   retcode = retcode.
            IF retcode NE c_oi_errors=>ret_ok.
              EXIT.
            ENDIF.
          ENDIF.
          IF NOT has_changed IS INITIAL.
            CALL METHOD proxy->save_document_to_table
                          IMPORTING retcode = retcode
                          CHANGING  document_table = data_table
                                    document_size = data_size.
            IF retcode NE c_oi_errors=>ret_ok.
              EXIT.
            ENDIF.
          ENDIF.
          CALL METHOD proxy->release_document
                                       IMPORTING retcode = retcode.
          SET HANDLER me->on_close_document FOR proxy ACTIVATION ' '.
          SET HANDLER me->on_custom_event FOR proxy ACTIVATION ' '.
        ELSE.
          retcode = c_oi_errors=>ret_document_not_open.
        ENDIF.
      ENDMETHOD.
      METHOD open_document_url.
                    IMPORTING open_inplace  TYPE c DEFAULT ' '
                              open_readonly TYPE c DEFAULT ' '
                              doc_url TYPE t_url DEFAULT ' '
                    RETURNING value(retcode) TYPE t_oi_ret_string.
        IF NOT proxy IS INITIAL.
          CALL METHOD me->close_document.
        ENDIF.
        CALL METHOD control->get_document_proxy
                 EXPORTING document_type = document_type
                 IMPORTING document_proxy = proxy
                           retcode = retcode.
        IF retcode NE c_oi_errors=>ret_ok.
          EXIT.
        ENDIF.
        me->doc_url = doc_url.
        CALL METHOD proxy->open_document
                               EXPORTING document_url = doc_url
                                         open_inplace = open_inplace
                                         open_readonly = open_readonly
                               IMPORTING retcode = retcode.
        IF retcode NE c_oi_errors=>ret_ok.
          EXIT.
        ENDIF.
      Document shall also be available in ITAB for respective operations:
        CALL METHOD proxy->save_document_to_table
                          IMPORTING retcode = retcode
                          CHANGING  document_table = data_table
                                    document_size = data_size.
        IF retcode NE c_oi_errors=>ret_ok.
          EXIT.
        ENDIF.
        SET HANDLER me->on_close_document FOR proxy.
        SET HANDLER me->on_custom_event FOR proxy.
        CALL METHOD proxy->update_document_links
                               EXPORTING update_manual_links = 'X'
                               IMPORTING retcode = retcode.
      ENDMETHOD.
      METHOD retrieve_document.
                 importing documents type document_list
                 exporting document_format type soi_document_format
                           doc_url type t_url.
    *----BDS-Data-Structures:--
    Tables and WAs:
        DATA: doc_signature TYPE sbdst_signature,
              wa_doc_signature LIKE LINE OF doc_signature,
              doc_components TYPE sbdst_components,
              wa_doc_components LIKE LINE OF doc_components,
              doc_properties TYPE sbdst_properties,
              wa_doc_properties LIKE LINE OF doc_properties,
              doc_uris TYPE sbdst_uri,
              wa_doc_uris LIKE LINE OF doc_uris.
    ID's:
        DATA: doc_classname TYPE sbdst_classname VALUE 'SOFFICEINTEGRATION',
              doc_classtype TYPE sbdst_classtype VALUE 'OT',
            doc_object_key TYPE sbdst_object_key VALUE 'SOFFICEINTEGRATION',
              doc_mimetype TYPE bapicompon-mimetype.
        DATA: field_desc TYPE TABLE OF rsvbfidesc.
        DATA: wa_field_desc TYPE rsvbfidesc.
        DATA: l_nr LIKE sy-tabix.
        CLEAR: field_desc, wa_field_desc.
        wa_field_desc-fieldnum = 1.
        wa_field_desc-display = 'X'.
        APPEND wa_field_desc TO field_desc.
        l_nr = 0.
        CALL FUNCTION 'RS_VALUES_BOX'
             EXPORTING
                  left_upper_col = 5
                  left_upper_row = 5
                  pagesize       = 10
                  title          = 'Select document'(sdc)
             IMPORTING
                  linenumber     = l_nr
             TABLES
                  field_desc     = field_desc
                  value_tab      = documents
             EXCEPTIONS
                  OTHERS         = 1.
        IF sy-subrc EQ 0 AND l_nr NE 0.
          READ TABLE documents INDEX l_nr INTO descr.
          IF sy-subrc EQ 0.
            CLEAR: wa_doc_signature, wa_doc_components, wa_doc_uris.
            CLEAR: doc_signature, doc_components, doc_uris.
            wa_doc_signature-prop_name = 'DESCRIPTION'.
            wa_doc_signature-prop_value = descr-document_id.
            APPEND wa_doc_signature TO doc_signature.
            CALL METHOD bds_instance->get_info
                          EXPORTING classname = doc_classname
                                    classtype = doc_classtype
                                    object_key = doc_object_key
                          CHANGING components = doc_components
                                   signature = doc_signature
                          EXCEPTIONS nothing_found = 1
                                     error_kpro = 2
                                     internal_error = 3
                                     parameter_error = 4
                                     not_authorized = 5
                                     not_allowed = 6.
            IF sy-subrc NE 0 AND sy-subrc NE 1.
              MESSAGE e016.
            ENDIF.
            IF sy-subrc = 1.
              MESSAGE e017.
            ENDIF.
            CALL METHOD bds_instance->get_with_url
                               EXPORTING classname = doc_classname
                                         classtype = doc_classtype
                                         object_key = doc_object_key
                               CHANGING uris = doc_uris
                                        signature = doc_signature
                          EXCEPTIONS nothing_found = 1
                                     error_kpro = 2
                                     internal_error = 3
                                     parameter_error = 4
                                     not_authorized = 5
                                     not_allowed = 6.
            IF sy-subrc NE 0 AND sy-subrc NE 1.
              MESSAGE e016.
            ENDIF.
            IF sy-subrc = 1.
              MESSAGE e017.
            ENDIF.
            READ TABLE doc_components INTO wa_doc_components INDEX 1.
            READ TABLE doc_uris INTO wa_doc_uris INDEX 1.
            doc_mimetype = wa_doc_components-mimetype.
            doc_url = wa_doc_uris-uri.
            CASE doc_mimetype.
              WHEN 'application/x-rtf' OR 'text/rtf'.
                document_format = soi_docformat_rtf.
              WHEN 'application/x-oleobject'.
                document_format = soi_docformat_compound.
              WHEN 'text/plain'.
                document_format = soi_docformat_text.
              WHEN OTHERS.
                document_format = soi_docformat_native.
            ENDCASE.
          ENDIF.
        ENDIF.
      ENDMETHOD.
      METHOD on_close_document.
                 FOR EVENT on_close_document OF c_oi_ole_container_control
                 IMPORTING document_proxy has_changed.
        DATA: answer, do_save.
        IF has_changed EQ 1.
          CALL FUNCTION 'POPUP_TO_CONFIRM'
               EXPORTING
                    titlebar              = 'Office Integration Demo'(oid)
                    text_question         = 'Save Document?'(sav)
                    display_cancel_button = ' '
               IMPORTING
                    answer                = answer.
          IF answer EQ '1'.
            do_save = 'X'.
          ELSE.
            do_save = ' '.
          ENDIF.
          CALL METHOD me->close_document
                        EXPORTING do_save = do_save.
          CALL METHOD c_oi_errors=>show_message
                                      EXPORTING type = 'E'.
        ENDIF.
      ENDMETHOD.
      METHOD on_custom_event.
                 FOR EVENT on_custom_event OF i_oi_document_proxy
                 IMPORTING document_proxy event_name param_count
                           param1 param2 param3.
        IF event_name EQ 'ON_SERIES_CHANGE'.
          CALL METHOD table_coll->get_table
                        EXPORTING table_name = 'SALES_IN'
                        IMPORTING retcode = retcode
                        CHANGING  data_table = test_table.
          CALL METHOD c_oi_errors=>show_message
                                      EXPORTING type = 'E'.
          CLEAR wa_test_table.
          READ TABLE test_table INTO wa_test_table INDEX 1.
          usa_sales = wa_test_table-sales.
          CLEAR wa_test_table.
          READ TABLE test_table INTO wa_test_table INDEX 2.
          europe_sales = wa_test_table-sales.
          CLEAR wa_test_table.
          READ TABLE test_table INTO wa_test_table INDEX 3.
          japan_sales = wa_test_table-sales.
          CLEAR wa_test_table.
          READ TABLE test_table INTO wa_test_table INDEX 4.
          asia_sales = wa_test_table-sales.
          CLEAR wa_test_table.
          READ TABLE test_table INTO wa_test_table INDEX 5.
          america_sales = wa_test_table-sales.
          CLEAR wa_test_table.
          READ TABLE test_table INTO wa_test_table INDEX 6.
          africa_sales = wa_test_table-sales.
          CLEAR wa_test_table.
        ENDIF.
        CALL METHOD control->set_focus.
      ENDMETHOD.
    ENDCLASS.
    FORM refresh_sales.
    FORM refresh_sales.
      DATA: BEGIN OF item_line,
                 region(60),
                 sales TYPE i,
                 date  TYPE d,
                 time  TYPE t,
                 weight TYPE f,
                 amount TYPE p DECIMALS 3,
                 id(10) TYPE n,
            END OF item_line.
      DATA: sales_table LIKE TABLE OF item_line.
      DATA: wa_sales_table LIKE item_line.
      DATA: fields_table TYPE TABLE OF rfc_fields.
      DATA: wa_fields_table TYPE rfc_fields.
      DATA: ind TYPE i.
      CALL FUNCTION 'DP_GET_FIELDS_FROM_TABLE'
           TABLES
                data   = sales_table
                fields = fields_table.
      READ TABLE fields_table INDEX 1 INTO wa_fields_table.
      wa_fields_table-fieldname = 'Region'."#EC NOTEXT
      MODIFY fields_table FROM wa_fields_table INDEX 1.
      CLEAR wa_fields_table.
      READ TABLE fields_table INDEX 2 INTO wa_fields_table.
      wa_fields_table-fieldname = 'Sales'. "#EC NOTEXT
      MODIFY fields_table FROM wa_fields_table INDEX 2.
      CLEAR: sales_table, wa_sales_table.
      wa_sales_table-region = 'USA'(usa).
      wa_sales_table-sales = usa_sales.
      APPEND wa_sales_table TO sales_table.
      CLEAR wa_sales_table.
      wa_sales_table-region = 'Europe'(eur).
      wa_sales_table-sales = europe_sales.
      APPEND wa_sales_table TO sales_table.
      CLEAR wa_sales_table.
      wa_sales_table-region = 'Japan'(jap).
      wa_sales_table-sales = japan_sales.
      APPEND wa_sales_table TO sales_table.
      CLEAR wa_sales_table.
      wa_sales_table-region = 'Asia'(asi).
      wa_sales_table-sales = asia_sales.
      APPEND wa_sales_table TO sales_table.
      CLEAR wa_sales_table.
      wa_sales_table-region = 'America'(ame).
      wa_sales_table-sales = america_sales.
      APPEND wa_sales_table TO sales_table.
      CLEAR wa_sales_table.
      wa_sales_table-region = 'Africa'(afr).
      wa_sales_table-sales = africa_sales.
      APPEND wa_sales_table TO sales_table.
      CLEAR wa_sales_table.
      LOOP AT sales_table INTO wa_sales_table.
        ind = sy-tabix.
        wa_sales_table-date = sy-datum + ind.
        wa_sales_table-time = sy-uzeit + ind.
        wa_sales_table-weight = 100000 * ind.
        wa_sales_table-amount = 11111 * ind.
        wa_sales_table-id = ind.
        MODIFY sales_table FROM wa_sales_table INDEX ind.
      ENDLOOP.
      CALL METHOD table_coll->add_table
                        EXPORTING table_name = 'SALES_OUT'
                                  table_type = table_coll->table_type_output
                        IMPORTING retcode = retcode
                        CHANGING  data_table = sales_table
                                  fields_table = fields_table.
      CALL METHOD link_server->add_table_item2
               EXPORTING item_name = 'Sales'    "#EC NOTEXT
                         item_title = 'Car Sales Figures'(sal)
               IMPORTING retcode = retcode
               CHANGING  data_table = sales_table
                         fields_table = fields_table.
      CALL METHOD link_server->add_string_item
               EXPORTING item_name   = 'ChartTitle'
                         item_title  = 'Chart Title'(ti0)
                         item_value  = 'Car Sales by Region'(ti1)
                         no_flush    = 'X'
               IMPORTING retcode = retcode.
      CALL METHOD link_server->add_string_item
               EXPORTING item_name   = 'ColumnTitle1'
                         item_title  = 'Column Title 1'(ti2)
                         item_value  = 'Region'(ti3)
                         no_flush    = 'X'
               IMPORTING retcode = retcode.
      CALL METHOD link_server->add_string_item
               EXPORTING item_name   = 'ColumnTitle2'
                         item_title  = 'Column Title 2'(ti4)
                         item_value  = 'Sold Cars'(ti5)
                         no_flush    = ' '
               IMPORTING retcode = retcode.
    ENDFORM.

  • Abstract class method polymorphically using constructors?

    how can i have a method defined in an abstract superclass call a constructor of the actual class running the method?
    abstract class A {
    public List getMultple() {
    List l = new ArrayList();
    for (short i=0;i<4;i++) {
    l.add(this());//<obviously this breaks
    return l
    or something like that. A won't run this method, but its children will...and they can call their constructors, but what do i put here to do that?
    i've tried a call back. an abstract method getOne() in the superclass forces each child to define that method and in each of those i return the results of a constructor. that works fine.
    the problem is i want to abstract this method out of each of these children classes cause its the exact same in each one, just using a different constructor to get multiple of each in a list. so if i use this callback method, then i am not saving the number of methods in each class, so why bother at all?
    any ideas?

    I still say you are coming at it from the wrong angle. A super class is not the way to go. What you are doing sounds like something very similar to something I did not too long ago.
    My requirement was that I had tab delimited text files filed with data that I had to parse. Each line would be used to instantiate one object, so a particular file could be used to instantiate, for example, a thousand objects of the same class. There were different types of files corresponding to different classes to instantiate instances of.
    Here is the design I ended up using.
    An object of class DataTextFileReader is instantiated to parse the text file and generate objects. It includes code for going line by line, handling bad lines and generating objects and reports. The constructor:
    public DataTextFileReader(File inputFile, LineParser<T> theLineParser)LineParser is an interface with one method:
    public T read(String line);When you call a load() method of the DataTextFileReader, it does its thing with the aid of the LineParser's read method, to which each line is passed, and stores the generated objects in an ArrayList. This can be returned by using another method. There are other methods for getting the reports, etc.
    Obviously, the LineParser chosen needs to have code appropriate for parsing the lines in question, so you have to choose and instantiate the right one.
    I find this design to work well. I arrived at it after spending hours giving myself headaches trying to come up with a design where there was a superclass roughly equivalent to the DataTextFileReader mentioned above, and classes extending this that fulfilled the duty of the LineParsers mentioned above... rather like what you are trying to do now.
    I did not care for the solution at first because it did not give me the "Ah, I am clever!" sensation I was expecting when I finally cracked the problem using inheritance, but I quickly came to think that it was much better OOD anyway.
    The LineParsers mentioned above are essentially embodiments of the Factory pattern, and I would recommend you do something similar in your case. Obviously your "constructors" all have to be different, so you should make a separate class for each of those. Then you can put the code that performs the query and loops to create loads of objects in another class called something like DatabaseDepopulator, using appropriate generics as in my example. Really it is the same problem, now that I look at it.
    This will also result in better separation of concepts, if you ask me. Why should the class constructor know how to parse a database result query, much less perform the query? It has nothing to do with databases (I presume). That is the job of an interpreter object.
    As a final note, remember... 95% of the time you feel like the language won't let you do what you want, it is because you shouldn't anyway.
    Drake

  • Why do we use init() method instead of constructor to initialize a servlet?

    Why do we use init() method instead of constructor to initialize a servlet?

    I suspect the reasons are partly historical. A servlet is loaded dynamically, by class name and, once you've loaded the Class, it's easier to to a newInstance, using the default construtor than it is to search for a particular matching constructor and invoke it.

  • Creating a method inside a constructor

    Can we create a method inside a Constructor??

    Encephalopathic wrote:
    uj_ wrote:
    Pascal doesn't have classes so it has no constructors either.Its latest incarnation, object pascal / Delphi did. I was working with that in the early '90s.Isn't the relation between Pascal and Object Pascal like that of C to C++?
    C didn't become C++. It stays C. And Pascal didn't become Object Pascal. It stays Pascal.
    So Pascal doesn't have classes or constructors. A company driven Pascal derivate called Object Pascal has.

  • Catch exceptions that occur in the constructor of a managed bean

    Hello,
    I would like to catch exceptions that might occur in the constructor of a managed bean and redirect to an error page. My beans need to get data from a database and if the database is not accessible, an error page is to tell the user "try again later". I don't want to write an action or actionListener that is invoked by a button klick on the previous page to make error handling easier, because an actionListener should not know about the next page and what data the next page will need.
    I read all postings about this topic I could find in this forum. And there are three solutions I tried:
    1) register an error-page in web.xml
    Is there an example for using this in a JSF application? It did not work. I got a "Page not found" exception
    2) Use a phase listener. But how can a phase listener do this? Is there an example? I don't think it can do it in the beforePhase method because this method is called before the constructor of the managed bean is called.
    3) Use a custom ViewHandler. This is my renderView method which creates a "Page not found" Exception.
    public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
    ViewHandler outer = context.getApplication().getViewHandler();
    try {
    super.renderView(context, viewToRender);
    } catch (Exception e) {
    context.getExternalContext().redirect("/error.jspx");
    Several people write they've done it one or the other way. Please share your knowledge with us !!
    Regards,
    Mareike

    Hallo Mareike,
    Maybe I should abandon managed beans, create my own
    "unmanaged" ones inside of an action listener and put
    them somewhere my pages can find them.
    Its a pity, because I like the concept of managed
    beans.sure setter injection of JSF is fine!
    well workaround could be using <h:dataTable rendered="#bean.dbAccessible" ...>
    In your constructor you catch the exception and set
    dbAccessible = false;
    or you use error pages of webcontainer,
    but the pages couldn't contain JSF components, IMHO
    only plain JSP files.
    BTW perhaps somebody on MyFaces' list knows the solution:
    http://incubator.apache.org/myfaces/community/mailinglists.html
    Regards,
    Mareike-Matthias

  • Cant see methods of the class

    Hello,
    I am using NetBeans IDE for development. Problem is that, I cant see the methods of the class. I have imported the required class, I have created its reference as public and static. and I have created its object inside the constructor.
    Now, when I type '.' [dot] in front of object created, netBeans displays the list of available methods. But it doesnt show all the methods. What might be the problem? If anything unclear to you, please ask me.
    Thanks and regards.

    Thanks! Following is the sample code snippet. This class is compiled successfully and also its getting executed very well. I am using this code in my project.
    import javax.swing.tree.*;
    import javax.swing.*;
    import java.io.*;
    public class MyTree {
        public static DefaultTreeModel model;
        public static JTree myTree;
        public MyTree() {
            DefaultMutableTreeNode root = new DefaultMutableTreeNode("ROOT");
            model = new DefaultTreeModel(root);
            model.setAsksAllowsChildren(true);
            myTree = new JTree(model);
            myTree.setShowsRootHandles(false);
            JScrollPane jScrollPane3 = new JScrollPane(myTree);       
    }1) model.setAsksAllowsChildren(true);
    No compile time error, No rutime error/exception. But when I type '.' [dot] in front of model, I cant see this method in the list displayed.
    2) myTree.setShowsRootHandles(false);
    Same case with this also.
    i.e. I am using both setAsksAllowsChildren() and setShowsRootHandles() methods, but I cant see them in the dropDownList displayed by typing '.' after corresponding objects i.e model and myTree respectievly.
    hope this will clear the problem.

  • How call the constructor of the super type in the sub type?

    Hi, everybody:
    There are two type as belowing code:
    CREATE TYEP super_t AS OBJECT (
    a NUMBER(7,1),
    b NUMBER(7,1),
    CONSTRUCTOR FUNCTION super_t
    (a IN NUMBER:=null, b IN NUMBER:=null) RETURN SELF AS RESULT
    ) NOT FINAL;
    CREATE TYEP sub_t UNDER super_t (
    CONSTRUCTOR FUNCTION sub_t RETURN SELF AS RESULT
    Because super_t has the constructor that can pass 0 to two parameters, does the constructor of the sub_t can call the constructor of the super_t to create the instance of the sub_t?
    If can, how call?
    If not, need to rewrite the code as the constructor of the super_t in the constructor of the sub_t?
    Thank you very much!

    No the supertype constructor is not automatically called (that should have been trivial for you to prove to yourself). Unfortunately, you can't call it from the subtype either (there is functionality like Java's 'super'). You could define a named method in the supertype that does the initialization and call that in both the constructors however.

Maybe you are looking for

  • Do I use Service Catalogue or Business Services for this?

    Hi I'm just looking at implementing System Centre Service Manager - I'm an ITIL expert but not a Microsoft techie so bear with me! I need to represent 130ish Services within SCSM which are different products we sell and support for our clients. Incid

  • Display driver update (?)

    Newbie to MBP (changed from Win XP). Having a Samsung 940b connected as external display, text is a bit blurry in Gmail inside FF browser but ok in iMail. Any tips ? update display driver .. ? change some settings in System pref's .. ? /Lars

  • Hi freinds.....URGENT....

    Hi freinds, Please solve my problems and it will greatful help me....... 1.In APP, complete the run system will clear all open items and printed cheques. after giving printing system doesn't print the cheques, becoz printer is not ready at the moment

  • How cooperative is Apple Customer Care?

    I received my week 37 Macy Gray iPod Touch in the mail from apple.com on the 20th and I've been looking at it trying to figure out exactly what makes it seem off. I thought for a while I was just seeing things out of anxiety from dropping $400 for a

  • Blackberry problom

    my blackberry pearl 8230 won't reboot