当前位置: 首页 > 知识库问答 >
问题:

嵌套子类实例化声明Java

莫飞翮
2023-03-14

来自JavaScript背景,我发现以下代码有点过于健壮,包含多条语句;我想知道如何简化代码,并在一条语句中完成所有操作。

Student是超类,Friend和Schedule是聚合到超类ArrayList公共成员中的子类(这些不是嵌套类)。这是我当前的代码:

public static void main(String[] args) {

  // Subclass1 instantiation and declaration
  Friend friend_of_andy_1 = new Friend(1002, "Bob");
  ArrayList<Friend> andys_friends = new ArrayList<>();
  andys_friends.add(friend_of_andy_1);    // superclass member

  // Subclass1 instantiation and declaration
  Schedule schedule_of_andy_1 = new Schedule(1, "Yoga practice");
  ArrayList<Schedule> andys_schedule = new ArrayList<>();
  andys_schedule.add(schedule_of_andy_1); // superclass member

  // Superclass instantiation declaration with subclass objects in constructor argument
  Student student_andy = new Student(1001, "Andy", andys_friends, andys_schedule);

}

我想知道我是否可以做这样的事情,在一个语句中声明/实例化超类和子类;这可能吗?

public static void main(String[] args) {

  Student student_andy = new Student(
    1001,
    "Andy",
    // instantiation of subclass
    ArrayList<Friend>[
      Friend(
        {
          1002,
          "Bob"
        }
      )
    ],
    ArrayList<Schedule>[
      Schedule(
        {
          1,
          "Yoga practice"
        }
      )
    ]
  )

};

共有2个答案

蓝慈
2023-03-14

好吧,那么,从本质上讲,您太缺少JSON了?可以理解。

下面是一个松散的方法集合,用于在Java中创建实例,使其看起来尽可能像JSON。

1)数组:使用内联数组文字

它们在Java中稍显冗长,但几乎与JSON中的一样好,例如:

new int[]{1, 2, 3}

是整数数组的文本。

2) 对象:定义适当的构造函数

如果您的朋友有一个构造函数(int-id,String-name),那么初始化朋友真的很容易,也很愉快:

new Friend(1234, "Bob")

3) 对象越多,使用factory方法的速度越快

如果定义工厂方法,则可以去掉新的。E、 g.如果你有

class Friend {
    ...
    static Friend friend(int id, String name) { return new Friend(id, name); }
}

然后你甚至可以去掉新的。这在那些很少定义某种嵌入式DSL的情况下很有用,并且确实需要这个构造函数上千次。

4)列表:使用asList

可以使用Java中的静态导入导入静态方法:

import static java.util.Arrays.asList;

现在您有了方便的asList,这样

asList(friend(2, "John"), friend(3, "Bob"))

给你一个朋友列表。

5)地图:使用带有初始化块的匿名子类。

这个看似疯狂的东西在java中工作:

HashMap<String, Integer> hm = new HashMap<>{{
  put("foo", 10);
  put("bar", 20);
}};

这是因为内部花括号对包含一个初始化块,您可以在其中调用this上的方法。

好的,现在您可以轻松创建:

  • 基本元素:字符串、int、double
  • 用户定义的对象(使用构造函数和工厂方法)
  • 阵列
  • 列表
  • 地图

这应该足以在Java中创建临时json式的数据结构

现在,假设所有构造函数都到位,您的代码如下所示:

import static java.util.Arrays.asList;

...

Student student_andy = new Student(
  1001,
  "Andy",
  asList(new Friend(1002, "Bob")),
  asList(new Schedule(1, "Yoga practice"))
)

我们在这里没有使用地图,所以初始化块的提示只是一个奖励。

[脚注-1]更准确地说:似乎你缺少JavaScript的片段,它允许轻松初始化那些规范映射到JSON对象的对象。JSON当然不是JavaScript。谢谢@Andreas指出这一点。

滕无尘
2023-03-14

首先,您只在一个地方使用friend_of_andy_1,因此您可以消除它:

List<Friend> andys_friends = new ArrayList<>();
andys_friends.add(new Friend(1002, "Bob"));

其次,如果您对具有固定大小的列表没有意见,即不能向其中添加更多元素,那么可以使用数组。asList(),而不是创建数组列表:

List<Friend> andys_friends = Arrays.asList(new Friend(1002, "Bob"));

然后,您可以对计划执行相同的操作,并在创建学生时内联该操作:

Student student_andy = new Student(1001, "Andy",
                                   Arrays.asList(new Friend(1002, "Bob")),
                                   Arrays.asList(new Schedule(1, "Yoga practice")));

如果列表必须可调整大小,则使用ArrayList​(集合

Student student_andy = new Student(
        1001,
        "Andy",
        new ArrayList<>(Arrays.asList(
                new Friend(1002, "Bob")
        )),
        new ArrayList<>(Arrays.asList(
                new Schedule(1, "Yoga practice")
        ))
);

当然还有你想要的格式,如果你喜欢占用太多代码行的分解样式:

Student student_andy = new Student(
    1001,
    "Andy",
    new ArrayList<>(
        Arrays.asList(
            new Friend(
                1002,
                "Bob"
            )
        )
    ),
    new ArrayList<>(
        Arrays.asList(
            new Schedule(
                1,
                "Yoga practice"
            )
        )
    )
);
 类似资料:
  • 在Oracle的Java教程中,我找到了以下文本: 与类方法和变量一样,静态嵌套类与其外部类关联。和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法--它只能通过对象引用来使用它们。 注意:一个静态嵌套类与它的外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了方便打包,它已经嵌套在另一个顶级类中。 我认为不可能实例化一个静态类

  • 问题内容: 在Oracle的Java 教程中,我找到了以下文本: 与类方法和变量一样,静态嵌套类与其外部类相关联。与静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法-它只能通过对象引用来使用它们。 注意:静态嵌套类与它的外部类(和其他类)的实例成员进行交互,就像其他任何顶级类一样。实际上,静态嵌套类在行为上是顶级类,为了包装方便,该顶级类已嵌套在另一个顶级类中。 静态嵌套类使用

  • 问题内容: 阅读其他人的代码,我已经看到很多: 我的问题是:用这种方式实例化它们的目的/优点是什么,而不是: 令我感到奇怪的是,我从未见过类似的东西: 要么 问题答案: 快速回答?使用接口和超类可以提高代码的可移植性和可维护性,主要是通过隐藏实现细节。采取以下假设示例: 我已经声明了一个帐户合同,该合同规定可以将已发布到该帐户的交易作为集合进行检索。我的代码的调用者不必关心我的方法实际上返回的集合

  • 使用Laravel 5.6,我试图从MySQL类别表中显示子类别的子类别。我想传递这个名字,并获得它的所有子类,而不管父类是什么。 类别表 期望结果 return App\Category::where('name','Child-1-P-2'))-

  • 本文向大家介绍ruby声明式语法的实现例子,包括了ruby声明式语法的实现例子的使用技巧和注意事项,需要的朋友参考一下 在ActiveRecord可以用很方便的声明方式来定义model之间的关联关系,例如: has_many和belongs_to其实是Topic类的class method,标准写法是: 那么has_many可以给我们带来什么呢?类方法has_many在被执行的时候,给Topic的

  • 问题内容: 这个问题在Google上到处都有,但我仍然遇到问题。这就是我想要做的。因此,就像标题状态一样,我遇到了“对象不是声明类的实例”错误。有任何想法吗?谢谢! Main.java TestFunction.java 问题答案: 您正在使用该类调用该方法,但需要一个实例。试试这个: