What I did is
public class MainActivity extends Activity {
    private final String[] types = { "s1", "s2", "s3" };
But I want to keep those values in res/values/types.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array
        name="types">
            <item>s1</item>
            <item>s2</item>
            <item>s3</item>
    </string-array>
</resources>
So I changed to
public class MainActivity extends Activity {
    private final String[] types = getResources().getStringArray(R.array.types);
But I get exception when app starts
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
So I suppose the only solution is to load that array in onCreate? If so then after Activity recreation should I load it again?
                        
You are right, onCreate is a good place to initialize your variable. Apparently getResources() method cannot be used before activity (context) is properly initialized.
However, if you don't need a super effective code, you can simply use
getResources().getStringArray(R.array.types)when you need your array or you can create a method