【问题标题】:Java Object Without a Class没有类的 Java 对象
【发布时间】:2015-12-28 17:39:30
【问题描述】:

我不知道这在 Java 中是否可行,但我想知道是否可以在 Java 中使用对象来返回多个值而不使用类。

通常当我想在 Java 中执行此操作时,我会使用以下代码

public class myScript {

    public static void main(String[] args) {

        // initialize object class
        cl_Object   lo_Object   = new cl_Object(0, null);

        // populate object with data
        lo_Object = lo_Object.create(1, "test01");
        System.out.println(lo_Object.cl_idno + " - " + lo_Object.cl_desc);

        //
        // code to utilize data here
        //

        // populate object with different data
        lo_Object = lo_Object.create(2, "test02");
        System.out.println(lo_Object.cl_idno + " - " + lo_Object.cl_desc);

        //
        // code to utilize data here
        //

    }

}

// the way I would like to use (even though it's terrible)

class cl_Object {

    int      cl_idno   = 0;
    String   cl_desc   = null;
    String   cl_var01  = null;
    String   cl_var02  = null;

    public cl_Object(int lv_idno, String lv_desc) {
        cl_idno  = lv_idno;
        cl_desc  = lv_desc;
        cl_var01 = "var 01";
        cl_var02 = "var 02";
    }

    public cl_Object create(int lv_idno, String lv_desc) {
        cl_Object   lo_Object   = new cl_Object(lv_idno, lv_desc);
        return lo_Object;
    }

}

// the way I don't really like using because they get terribly long

class Example {

    int      idno = 0;
    String   desc = null;
    String   var01 = null;
    String   var02 = null;

    public void set(int idno, String desc) {
        this.idno = idno;
        this.desc = desc;
        var01     = "var 01";
        var02     = "var 02";
    }

    public int idno() {
        return idno;
    }

    public String desc() {
        return desc;
    }

    public String var01() {
        return var01;
    }

    public String var02() {
        return var02;
    }

}

在 Javascript 中考虑到这似乎需要做很多工作(我知道它们是不同的)我可以达到同样的效果

var lo_Object = f_Object();
console.log(lo_Object["idno"] + " - " + lo_Object[desc]);

function f_Object() {

    var lo_Object = {};

    lo_Object = {};
    lo_Object["idno"] = 1;
    lo_Object["desc"] = "test01";

    return lo_Object;

}

注意

我知道命名约定是错误的,但这是故意的,因为我有一个与该程序一起运行的 informix-4gl 程序,因此编码标准来自我工作的公司

【问题讨论】:

  • 是否有需要 create 方法的原因?为什么不直接用正确的值初始化它呢?还是您希望能够更改这些值?在这种情况下,您可以只使用 set 方法来设置对象的值,而不是创建构造函数。
  • 请遵循 Java 的命名约定。
  • @user 我不知道如何在没有构造函数的情况下返回值,有你建议的例子吗?
  • 如果变量是公开的,您可以在不使用 get 方法的情况下访问它们,否则您必须使用方法来获取值。如果您不需要更改值,您可以使用正确的值初始化对象。
  • @user 哦,我明白了,这对我不起作用,因为我将使用不同的值作为参数多次调用该方法

标签: java object methods return-value


【解决方案1】:

最好的方法是使用 HashMap

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Object> person =
            new HashMap<String, Object>();
        
        // add elements dynamically
        person.put("name", "Lem");
        person.put("age", 46);
        person.put("gender", 'M');

        // prints the name value
        System.out.println(person.get("name")); 
       
        // asures that age element is of integer type before  
        // printing
        System.out.println((int)person.get("age"));
        
        // prints the gender value
        System.out.println(person.get("gender"));
       
        // prints the person object {gender=M, name=Lem, age=46}
        System.out.println(person); 
    }
}

这样做的好处是您可以随时添加元素。 这样做的缺点是您将失去类型安全性,就像 age 的情况一样。确保 age 始终是整数是有代价的。因此,为了避免这种成本,只需使用一个类。

【讨论】:

  • 在这个例子中,HashMap 比 Hashtable 更可取。 Hashtable 是同步的,而 HashMap 不是。并且获得同步映射的首选方法不再是使用 Hashtable,而是调用 Collections.synchronizedMap 并在参数中使用您想要的(非同步)实现。 Hashtable 应该被认为或多或少被弃用。
  • 感谢您的建议。我是 Java 复习者。
【解决方案2】:

不,没有这样的功能,你必须输入完整的类型名称(类名)。

或者使用可以使用val

https://projectlombok.org/features/val.html

另外,如果您使用 IntelliJ IDEA 试试这个插件:

https://bitbucket.org/balpha/varsity/wiki/Home

【讨论】:

    【解决方案3】:

    我不确定 Java 是否可行。 Class 是生成Object 的原始结构。我们需要一个类来生成对象。所以,对于上面的代码,我认为没有解决办法。

    【讨论】:

      【解决方案4】:

      Java 方法只允许一个返回值。如果要返回多个对象/值,请考虑返回其中一个集合。地图、列表、队列等

      您选择哪一种取决于您的需求。例如,如果要将值存储为键值对,请使用 Map。如果您只想按顺序存储值,请使用列表。

      带有列表的示例:

      list<Object> myList = new ArrayList<Object>();
      myList.add("Some value");
      return myList;
      

      附带说明,您的方法 create 是多余的。您应该使用 getter 和 setter 来填充对象,或者通过构造函数填充它。

      cl_Object   lo_Object   = new cl_Object(1, "test01");
      

      按照您现在的设置方式,您正在创建一个对象来创建另一个具有您想要的值的相同类型的对象。

      您的命名约定也是错误的。请参考Java标准命名约定:

      http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367

      【讨论】:

      • 只是为了解决冗余问题,我将如何以不同的方式编写创建方法,您有示例吗?
      • create 正在为另一个相同类型的对象设置值。我的意思是您的第一个 cl_Object 正在创建另一个具有您想要的值的 cl_Object。您可以在实例化对象时在构造函数中设置值。当您创建对象而不是将 0 和 null 传入构造函数时,传入“1”和“test01”。之后检查该对象,您会看到它设置了这些值。还要查找 java 中的 getter 和 setter 约定。它是设置与构造函数一起使用的属性的标准。您可能还想查看访问修饰符:)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      相关资源
      最近更新 更多