繁体   English   中英

Java:我的静态方法如何引用其类的静态全局对象?

[英]Java: How are my static methods referencing their class' static global objects?

这个关于静态方法的问题有关 ,但是我不确定我的问题得到了明确回答,因为我不确定一些细节。

我有一个小的手工api类(只是一个.class,没什么花哨的),它具有在全局级别实例化的javax客户端对象。

final private static Login login = new Login("emadden", "password");
final private static String baseUrl = "http://example.com";

private static Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class);
private static WebTarget target;
private static Invocation.Builder builder;
private static Response response;

由于javax客户端对象非常大,因此我想让自己和其他可能希望使用api的人避免意外创建一堆这些相当大的客户端对象,因此所有属性(包括客户端)和方法都必须包含api构造函数的例外是静态的。

// example method
public static Response getFrom(String pathUrl) throws RuntimeException{
    try {
        target = (WebTarget) client.target(baseUrl).path(pathUrl); // TODO: remove cast
        builder = target.request(MediaType.APPLICATION_JSON);
        response = builder.get();
        response.close();
        if (response.getStatus() == 204) {
            System.out.println("GET successful");
        } else if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error cod : "
                    + response.getStatus());
        }
    } catch(RuntimeException e) {System.out.println(e.getMessage());}
    return response;
}

现在,在我正在使用api类的类(main.class)中,是一个全局变量,一个名为data的ArrayList,它是通过对api类的静态方法调用实例化的。

// Global scope
private static ArrayList<List> data = api.getFrom(baseUrl + pathUrl).readEntity(ArrayList.class)

在main中没有实例化api类的任何地方,但是api.getFrom方法确实引用了api的全局客户端对象,这是否意味着仅调用此方法就可以创建客户端对象的实例? 会在其他地方再次调用它吗?

最后,我只是从方法中删除了“静态”,使属性保持静态,允许我使用main的api实例非静态地访问api,但是我担心有人创建api的实例api,然后将其作为参数传递,无意间创建了它的副本。

因此,出于知识方面的考虑,并且可能阻止我上面描述的事情发生,当像我最初所做的那样从静态上下文中调用api.getFrom()时会发生什么? 它是否创建其全局变量的实例,仅在我们超出方法调用范围时才丢弃它们? 我是否只是从方法中退出并删除了静态方法,还是有更好的方法来确保自己,或者其他用户不会意外地创建api实例和一堆大客户端对象?

在java中,作用域的概念是相对于类的。 没有全局变量,而是有类成员。 定义静态方法变量时,可以按预期在对象之间共享它。 但是,真正的目的是要在没有类的任何对象的情况下使用静态变量(使用类名而不是对象进行访问)。 这强加了一个限制,即静态方法只能访问该类的静态成员 (非静态成员仅使用构造函数实例化对象时创建 )。

因为客户端很大,所以我想让自己和其他可能要使用api的人避免意外创建一堆这些相当大的客户端对象,因此,所有属性(包括客户端)和方法(例外)的api构造函数是静态的。

好像您要实现单例模式。 使所有方法static

那么这是否意味着只需调用此方法即可创建客户端对象的实例? 会在其他地方再次调用它吗?

没有没有实例化的静态成员,您必须使用static块实例化静态成员。 加载类时,将执行静态块(一次在程序开头)。

希望这个简单的例子有帮助

public class MyApi {
    private static ArrayList<List> data;

    static {
    data =  // initaion logic
    }
}

有关静态块教程的更多信息
有关使用静态块进行初始化的文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM